python数据结构与算法链表知识
时间: 2023-08-28 18:06:27 浏览: 115
Python实现的数据结构与算法之链表详解
链表(Linked List)是一种常见的数据结构,它是由一系列节点组成的,每个节点包含一个数据元素和一个指向下一个节点的指针。链表中的节点可以在运行时动态添加或删除,这使得链表在某些场景下比数组更加适用。
在 Python 中,链表可以使用类来实现。下面是一个简单的链表实现:
```python
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def add_node(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
else:
current = self.head
while current.next is not None:
current = current.next
current.next = new_node
def remove_node(self, data):
if self.head is None:
return
if self.head.data == data:
self.head = self.head.next
else:
current = self.head
while current.next is not None:
if current.next.data == data:
current.next = current.next.next
break
current = current.next
def print_list(self):
current = self.head
while current is not None:
print(current.data, end=' ')
current = current.next
print()
```
这个链表实现包含两个类:Node 和 LinkedList。Node 表示链表中的节点,LinkedList 则是整个链表。Node 类中包含了数据元素和指向下一个节点的指针,LinkedList 类中包含了链表的头节点。add_node 方法用于向链表中添加节点,remove_node 方法用于从链表中删除节点,print_list 方法用于打印整个链表。
链表的常见操作包括遍历、插入、删除等。下面是一些链表的常见操作:
1. 遍历链表
遍历链表可以通过一个 while 循环实现,从头节点开始遍历,直到遇到 None 为止。
```python
def print_list(self):
current = self.head
while current is not None:
print(current.data, end=' ')
current = current.next
print()
```
2. 插入节点
在链表中插入节点需要注意节点的顺序。可以先找到要插入的位置,然后将新节点的指针指向下一个节点,再将前一个节点的指针指向新节点。
```python
def insert_node(self, data, position):
new_node = Node(data)
if position == 0:
new_node.next = self.head
self.head = new_node
else:
current = self.head
for i in range(position - 1):
current = current.next
if current is None:
return
new_node.next = current.next
current.next = new_node
```
3. 删除节点
在链表中删除节点需要先找到要删除的位置,然后将前一个节点的指针指向下一个节点。需要注意删除头节点和删除中间节点的情况。
```python
def remove_node(self, data):
if self.head is None:
return
if self.head.data == data:
self.head = self.head.next
else:
current = self.head
while current.next is not None:
if current.next.data == data:
current.next = current.next.next
break
current = current.next
```
链表的时间复杂度为 O(n),其中 n 是链表的长度。链表的优点是可以在运行时动态添加或删除节点,并且可以节省内存空间。缺点是不能像数组那样随机访问元素,需要从头节点遍历整个链表才能访问到某个元素。
阅读全文