Python数据结构与算法详解:15个核心数据结构和算法,提升编程功力
发布时间: 2024-06-19 13:53:34 阅读量: 73 订阅数: 52
详解python数据结构和算法
![Python数据结构与算法详解:15个核心数据结构和算法,提升编程功力](https://ask.qcloudimg.com/http-save/yehe-7769152/6abf2e3c32fd0ae9d0ed93e8e43ff67d.png)
# 1. Python数据结构概述
Python数据结构是用于组织和存储数据的抽象概念。它们提供了高效管理和处理数据的方法,是构建复杂应用程序的基础。数据结构的选择取决于应用程序的特定需求和要处理的数据类型。
Python提供了广泛的数据结构,包括列表、元组、字典、集合和队列。每个数据结构都有其独特的特性和用途。例如,列表是可变的顺序集合,而元组是不可变的顺序集合。字典是键值对的集合,而集合是无序的唯一元素集合。队列遵循先进先出(FIFO)原则,而栈遵循后进先出(LIFO)原则。
# 2. 线性数据结构
线性数据结构是一种元素按线性顺序组织的数据结构,其中每个元素都与前一个元素和后一个元素相连。它们是计算机科学中使用最广泛的数据结构之一,用于存储和处理有序数据。线性数据结构包括链表、栈和队列。
### 2.1 链表
链表是一种线性数据结构,其中元素存储在称为节点的动态分配的内存块中。每个节点包含数据和指向下一个节点的指针。链表中的第一个节点称为头节点,最后一个节点称为尾节点。
#### 2.1.1 单链表
单链表是一种链表,其中每个节点只指向下一个节点。它是一种简单的线性数据结构,易于实现和操作。
```python
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert_at_beginning(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node
def insert_at_end(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
else:
current_node = self.head
while current_node.next is not None:
current_node = current_node.next
current_node.next = new_node
def insert_at_index(self, index, data):
if index == 0:
self.insert_at_beginning(data)
else:
new_node = Node(data)
current_node = self.head
for i in range(index - 1):
current_node = current_node.next
new_node.next = current_node.next
current_node.next = new_node
def delete_at_beginning(self):
if self.head is None:
return
self.head = self.head.next
def delete_at_end(self):
if self.head is None:
return
if self.head.next is None:
self.head = None
else:
current_node = self.head
while current_node.next.next is not None:
current_node = current_node.next
current_node.next = None
def delete_at_index(self, index):
if index == 0:
self.delete_at_beginning()
else:
current_node = self.head
for i in range(index - 1):
current_node = current_node.next
current_node.next = current_node.next.next
def search(self, data):
current_node = self.head
while current_node is not None:
if current_node.data == data:
return True
current_node = current_node.next
return False
def print_list(self):
current_node = self.head
while current_node is not None:
print(current_node.data, end=" ")
current_node = current_node.next
```
#### 2.1.2 双链表
双链表是一种链表,其中每个节点指向下一个节点和前一个节点。这使得双链表在某些操作上比单链表更有效率,例如从链表中间删除节点。
```python
class Node:
def __init__(self, data):
self.data = data
self.next = None
self.prev = None
class DoublyLinkedList:
def __init__(self):
self.head = None
self.tail = None
def insert_at_beginning(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
self.tail = new_node
else:
new_node.next = self.head
self.head.prev = new_node
self.head = new_node
def insert_at_end(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
self.tail = new_node
else:
new_node.prev = self.tail
self.tail.next = new_node
self.tail = new_node
def insert_at_index(self, index, data):
if index == 0:
self.insert_at_beginning(data)
elif index == self.get_length():
self.insert_at_end(data)
else:
new_node = Node(data)
current_node = self.head
for i in range(index - 1):
current_node = current_node.next
new_node.next = current_node.next
current_node.next = new_node
new_node.prev = current_node
new_node.next.prev = new_node
def delete_at_beginning(self):
if self.head is None:
return
if self.head == self.tail:
self.head = None
self.tail = None
else:
self.head = self.head.next
self.head.prev = None
def delete_at_end(self):
if self.head is None:
```
0
0