1 链表
1.2 使用头插法和尾插法创建链表
2 链表的插入和删除
3 双链表
3.1 双链表节点的插入
3.2 双链表节点的删除
1 链表
链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item和指向下一个节点的指针next。
通过节点之间的相互连接最终串联成一个链表。
1.1 单链表
class Node:
def __init__(self, item=None):
self.item = item # 存储节点的数据
self.next = None # 指向下一个节点的指针,初始为 None
# a = Node(1)
# b = Node(2)
# c = Node(3)
# a.next = b
# b.next = c
#
# print(a.next.next.item)
1.2 使用头插法和尾插法创建链表
def create_link_list_head(li: list):
"""
使用头插法创建链表
头插法的特点是新节点总是插入到链表的头部,因此链表的顺序会与原始列表相反。
:param li: 包含要插入的元素的列表
:return: 链表的头节点
"""
head = Node(li[0]) # 初始化链表的头节点
for element in li[1:]: # 从列表的第二个元素开始遍历
node = Node(element) # 创建一个新的节点
node.next = head # 新节点的 next 指向当前的头节点
head = node # 更新头节点为新创建的节点
return head # 返回新链表的头节点
def create_link_list_tail(li: list):
"""
使用尾插法创建链表
尾插法的特点是新节点总是插入到链表的尾部,因此链表的顺序与原始列表相同。
:param li: 包含要插入的元素的列表
:return: 链表的头节点
"""
head = Node(li[0]) # 初始化链表的头节点
tail = head # 初始化尾节点为头节点
for element in li[1:]: # 从列表的第二个元素开始遍历
node = Node(element) # 创建一个新的节点
tail.next = node # 当前尾节点的 next 指向新节点
tail = node # 更新尾节点为新创建的节点
return head # 返回链表的头节点
def print_link_list(lk):
"""
打印链表中的所有节点
从链表的头节点开始,逐个打印每个节点的值,直到链表的末尾。
:param lk: 链表的头节点
"""
while lk: # 当当前节点不为 None 时继续循环
print(lk.item, end=',') # 打印当前节点的值,并在末尾加上逗号
lk = lk.next # 将当前节点更新为下一个节点
lk = create_link_list_head([1, 23, 33])
# lk = create_link_list_tail([1, 23, 33, 44])
print_link_list(lk)
2 链表的插入和删除
链表节点的插入 把4查到1和2中间
链表节点的插入可以分为几种常见情况:
在链表的头部插入节点、在链表的尾部插入节点、以及在链表的中间某个位置插入节点。
1. 在链表头部插入节点
在链表头部插入节点,也称为头插法,操作相对简单。新节点会成为链表的第一个节点,原来的头节点将成为第二个节点。
class Node:
def __init__(self, item=None):
self.item = item # 存储节点的数据
self.next = None # 指向下一个节点的指针
def insert_at_head(head: Node, item) -> Node:
"""
在链表头部插入新节点
:param head: 链表的头节点
:param item: 要插入的新数据
:return: 新的头节点
"""
new_node = Node(item) # 创建一个新的节点
new_node.next = head # 新节点的 next 指向当前的头节点
return new_node # 新节点现在成为头