链表简介
链表是一种常见的数据结构,它通过一系列节点在内存中按顺序存储和表示数据。每个节点由两部分组成:数据域和指针域。数据域用于存储节点的数据,指针域用于存储下一个节点的地址。
链表的特点
- 链表中的节点在内存中是非连续的,节点是通过指针链接起来的。
- 链表中插入和删除节点时间复杂度可以达到O(1),因为只需要改变节点的指针,而不需要移动整个链表。
- 链表访问任何一个位置的节点时间复杂度为O(n),需要从头节点开始顺序遍历到该位置。
链表常见的操作
- 遍历 - 从头节点开始,通过next指针访问每个节点
- 插入 - 在任意位置插入节点
- 删除 - 删除任意位置上的节点
- 查找 - 查找某个数据是否存在于链表中
下面通过Python代码实现一个简单的单向链表。
Python 实现单向链表
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def print_list(self):
cur_node = self.head
while cur_node:
print(cur_node.data)
cur_node = cur_node.next
def append(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
return
last_node = self.head
while last_node.next:
last_node = last_node.next
last_node.next = new_node
def prepend(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node
def insert_after_node(self, prev_node, data):
if not prev_node:
print("Previous node is not in the list")
return
new_node = Node(data)
new_node.next = prev_node.next
prev_node.next = new_node
def delete_node(self, key):
cur_node = self.head
if cur_node and cur_node.data == key:
self.head = cur_node.next
cur_node = None
return
prev = None
while cur_node and cur_node.data != key:
prev = cur_node
cur_node = cur_node.next
if cur_node is None:
return
prev.next = cur_node.next
cur_node = None
def delete_node_at_pos(self, pos):
cur_node = self.head
if pos == 0:
self.head = cur_node.next
cur_node = None
return
prev = None
count = 1
while cur_node and count != pos:
prev = cur_node
cur_node = cur_node.next
count += 1
if cur_node is None:
return
prev.next = cur_node.next
cur_node = None
def len_iterative(self):
count = 0
cur_node = self.head
while cur_node:
count += 1
cur_node = cur_node.next
return count
def len_recursive(self, node):
if node is None:
return 0
return 1 + self.len_recursive(node.next)
ll = LinkedList()
ll.append("A")
ll.append("B")
ll.append("C")
ll.append("D")
ll.delete_node("B")
ll.delete_node_at_pos(2)
ll.print_list()
print(ll.len_iterative())
print(ll.len_recursive(ll.head))
这个简单的实现演示了链表的基本结构和操作,可以处理节点的插入、删除、遍历等常见操作。链表是非常重要和常用的数据结构,在许多算法和应用中都会用到。