双向链表基本介绍
双向链表增删改查操作思路分析
双向链表增删改查操作代码实现
"""
双向链表的增删改查
"""
# 英雄类
class HeroNode:
next = None # 指向下一个节点,默认为空
pre = None # 指向前一个节点,默认为空
def __init__(self, id: int, name: str, nick_name: str):
self.id = id # 英雄ID
self.name = name # 英雄名字
self.nick_name = nick_name # 英雄昵称
def __str__(self):
return f"[{self.id}, {self.name}, {self.nick_name}]"
# 双向链表类
class DoubleLinkedList:
# 初始化头结点,头结点用于指向一个链表的位置,不存放具体的数据
head = HeroNode(0, "", "")
# 返回链表的头结点
def getHead(self):
return self.head
# 双向链表的遍历
def for_double_lined_list(self):
# 判断链表是否为空
if not self.head.next:
print("链表为空...")
return
temp = self.head.next # 获取链表的第一个数据节点
while temp: # 如果节点不为空(表示还没到链表的最后一个节点)
end = " -> " if temp.next else ""
print(temp, end=end) # 打印节点
temp = temp.next # 继续遍历下一个节点
print()
# 向链表中添加元素(在链表的末尾添加)
def add(self, node: HeroNode):
# 找到链表的最后一个节点
temp = self.head
while temp.next:
temp = temp.next
# 结束循环时,temp 指向链表最后一个节点
# 将要添加的节点插入到链表中
temp.next = node
node.pre = temp
# 修改链表的某个节点
def update(self, new_node: HeroNode):
# 判断链表是否为空
if not self.head.next:
print("链表为空...")
return
# 找到要修改的链表节点
temp = self.head.next
flag = False # 标记是否找到该节点
while temp:
if temp.id == new_node.id:
flag = True
break
temp = temp.next
if flag:
# 找到了要修改的节点,即为 temp
temp.name = new_node.name
temp.nick_name = new_node.nick_name
else:
print(f"没有找到编号为{new_node.id}的节点:")
# 双向链表删除节点
def delete(self, node: HeroNode):
# 判断链表是否为空
if not self.head.next:
print("链表为空...")
return
# 找到要删除节点在链表中的位置
temp = self.head.next
flag = False
while temp:
if temp.id == node.id:
flag = True
break
temp = temp.next
if flag:
# 找到了要删除的节点,即为 temp
temp.pre.next = temp.next
if temp.next: # temp 不是最后一个节点
temp.next.pre = temp.pre
else:
print(f"没有找到编号为{node.id}的节点")
# 双向链表增删改查功能测试
def test_double_linked_list():
# 创建四个英雄节点
node1 = HeroNode(1, "宋江", "及时雨")
node2 = HeroNode(2, "卢俊义", "玉麒麟")
node3 = HeroNode(3, "吴用", "智多星")
node4 = HeroNode(4, "林冲", "豹子头")
# 创建一个双向链表的实例对象
double_linked_list = DoubleLinkedList()
# 查看链表
double_linked_list.for_double_lined_list()
# 想链表添加节点
double_linked_list.add(node1)
double_linked_list.add(node2)
double_linked_list.add(node3)
double_linked_list.add(node4)
double_linked_list.for_double_lined_list()
# 修改
new_node = HeroNode(4, "公孙胜", "入云龙")
double_linked_list.update(new_node)
double_linked_list.for_double_lined_list()
# 删除
double_linked_list.delete(node3)
double_linked_list.for_double_lined_list()
test_double_linked_list()