python 双向链表

双向链表基本介绍 

python 双向链表_第1张图片

双向链表增删改查操作思路分析

python 双向链表_第2张图片 双向链表增删改查操作代码实现

"""
双向链表的增删改查
"""


# 英雄类
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()

 

你可能感兴趣的:(数据结构和算法,链表,python,数据结构)