链表是一种线性数据结构,它通过节点相连来存储数据.
什么是链表?
链表是一种线性数据结构,其中每个元素(称为节点)包含两个部分:
- 数据域 (Data) :存储实际的数据。
- 指针域 (Pointer/Link) :指向下一个节点的引用。对于单向链表来说,这个指针通常称为“next”。
链表的类型
1. 单向链表 (Singly Linked List)
- 每个节点只有一个指针,指向下一个节点。
-
特点:
- 插入和删除操作较简单,因为只需要修改一个指针。
- 访问特定元素的时间复杂度为O(n),因为需要从头开始遍历。
2. 双向链表 (Doubly Linked List)
- 每个节点有两个指针,一个指向下一个节点,另一个指向前一个节点。
-
特点:
- 插入和删除操作较复杂,因为需要修改两个指针。
- 访问特定元素的时间复杂度为O(n),但可以双向遍历。
3. 循环链表 (Circular Linked List)
- 链表的最后一个节点指向第一个节点,形成一个环。
-
特点:
- 在某些情况下(如循环队列)非常有用。
链表的操作
插入操作
- 在头部插入:将新节点的
next
指针指向当前头节点,然后更新头节点。 - 在尾部插入:遍历到链表的最后一个节点,将其
next
指针指向新节点。 - 在指定位置插入:找到目标节点,并调整指针以插入新节点。
删除操作
- 删除头部节点:将头节点更新为下一个节点。
- 删除尾部节点:遍历到倒数第二个节点,将其
next
指针设为null。 - 删除指定节点:找到目标节点,并调整前一个节点的
next
指针。
遍历操作
- 从头节点开始,依次访问每个节点,直到链表结束(即遇到null)。
实现单向链表
下面是一个简单的Python实现:
class Node:
def __init__(self, data):
self.data = data
self.next = None
class SinglyLinkedList:
def __init__(self):
self.head = None
def is_empty(self):
return self.head is None
def append(self, data):
new_node = Node(data)
if self.is_empty():
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
def prepend(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node
def delete(self, key):
if not self.is_empty():
if self.head.data == key:
self.head = self.head.next
return
current = self.head
while current.next and current.next.data != key:
current = current.next
if current.next:
current.next = current.next.next
def search(self, key):
current = self.head
while current:
if current.data == key:
return True
current = current.next
return False
def display(self):
current = self.head
while current:
print(current.data, end=" -> ")
current = current.next
print("None")
# 示例使用
llist = SinglyLinkedList()
llist.append(1)
llist.append(2)
llist.prepend(0)
llist.display() # 输出: 0 -> 1 -> 2 -> None
llist.delete(1)
llist.display() # 输出: 0 -> 2 -> None
print(llist.search(2)) # 输出: True