双向链表基本介绍
双向链表增删改查操作思路分析
双向链表增删改查操作代码实现
"""
双向链表的增删改查
"""# 英雄类
class HeroNode:next = None # 指向下一个节点,默认为空pre = None # 指向前一个节点,默认为空def __init__(self, id: int, name: str, nick_name: str):self.id = id # 英雄IDself.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("链表为空...")returntemp = 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.headwhile temp.next:temp = temp.next# 结束循环时,temp 指向链表最后一个节点# 将要添加的节点插入到链表中temp.next = nodenode.pre = temp# 修改链表的某个节点def update(self, new_node: HeroNode):# 判断链表是否为空if not self.head.next:print("链表为空...")return# 找到要修改的链表节点temp = self.head.nextflag = False # 标记是否找到该节点while temp:if temp.id == new_node.id:flag = Truebreaktemp = temp.nextif flag:# 找到了要修改的节点,即为 temptemp.name = new_node.nametemp.nick_name = new_node.nick_nameelse:print(f"没有找到编号为{new_node.id}的节点:")# 双向链表删除节点def delete(self, node: HeroNode):# 判断链表是否为空if not self.head.next:print("链表为空...")return# 找到要删除节点在链表中的位置temp = self.head.nextflag = Falsewhile temp:if temp.id == node.id:flag = Truebreaktemp = temp.nextif flag:# 找到了要删除的节点,即为 temptemp.pre.next = temp.nextif temp.next: # temp 不是最后一个节点temp.next.pre = temp.preelse: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()