python实现双链表 判空 长度 遍历 头插 尾插 插入 删除 范围查询 反转

本文详细介绍了一种数据结构——双向链表的实现方法,并提供了包括插入、删除、搜索及反转等基本操作的具体代码实现。通过实例展示了双向链表的初始化、节点添加、遍历等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# *-* coding:utf8 *-*


class Node(object):
    """抽象出节点类"""

    def __init__(self, obj):
        self.pre = None  # 指向上一个节点,初始为None
        self.data = obj  # 指向
        self.next = None


class DoubleLinkList(object):
    """双向链表(双链表)"""

    def __init__(self, head_node=None):
        """对于链表而言,只需要保存其一个节点即可,这里还是保存头节点"""
        self.__head = head_node

    def is_empty(self):
        """判断链表是否是空链表"""
        return self.__head is None

    def length(self):
        """判断链表的长度"""
        cur = self.__head
        count = 0
        while cur is not None:
            cur = cur.next
            count += 1

        return count

    def travel(self):
        """双向链表的遍历操作"""
        cur = self.__head
        while cur is not None:
            print(cur.data, end=" ")
            cur = cur.next
        print()

    def add(self, obj):
        """链表头插法"""
        # 构建 新节点
        node = Node(obj)
        if self.is_empty():
            self.__head = node
        else:
            node.next = self.__head
            self.__head.pre = node
            self.__head = node

    def append(self, obj):
        """双向链表 尾插法"""
        node = Node(obj)

        if self.is_empty():
            self.__head = node
        else:
            cur = self.__head
            while cur.next is not None:
                cur = cur.next
            cur.next = node
            node.pre = cur

    def insert(self, index, obj):
        """双向链表的插入操作"""
        assert isinstance(index, int)
        if index <= 0:
            self.add(obj)
        elif index >= self.length():
            self.append(obj)
        else:
            node = Node(obj)
            cur = self.__head
            for i in range(index):
                cur = cur.next
            cur.pre.next = node
            node.pre = cur.pre
            cur.pre = node
            node.next = cur

    def remove(self, obj):
        """移除双向链表中的元素"""
        if self.is_empty():
            return

        cur = self.__head

        while cur is not None:
            if cur.data == obj:
                # 找到了要删除的节点
                if self.length() == 1:
                    # 只有一个节点
                    self.__head = None
                if cur.pre is not None and cur.next is not None:
                    cur.pre.next = cur.next
                    cur.next.pre = cur.pre  # 可能不存在 pre 尾节点
                    # 要将这个节点回收
                    del cur
                elif cur.pre is not None:
                    # 表示要删除的是尾节点
                    cur.pre.next = None
                    del cur
                elif cur.pre is None:
                    self.__head = cur.next
                    cur.next.pre = None
                    del cur
                # 如果找到了, 退出循环
                break

            cur = cur.next

    def search(self, obj):
        """查找某个节点是否存在"""
        cur = self.__head
        while cur is not None:
            if cur.data == obj:
                return True
            cur = cur.next

        # 默认不存在
        return False

    def reverse(self):
        """双链表反转"""
        cur = self.__head
        # 如果cur 是空链表,不做任何处理;
        if not cur:
            return

        cur.pre = cur.next
        cur.next = None

        while cur.pre is not None:
            # 先处理pre,再处理next
            cur.pre.pre = cur.pre.next
            cur.pre.next = cur
            cur = cur.pre

        self.__head = cur

        return self


if __name__ == '__main__':
    dll = DoubleLinkList()

    print(dll.is_empty())
    print(dll.length())

    dll.add(100)
    print(dll.is_empty())
    print(dll.length())
    dll.travel()

    dll.add(200)
    print(dll.is_empty())
    print(dll.length())
    dll.travel()

    dll.append("zhangsan")
    print(dll.length())
    dll.travel()

    dll.append("lisi")
    print(dll.length())
    dll.travel()

    dll.insert(-5, "he")
    dll.travel()

    dll.insert(1, "her")
    dll.travel()

    dll.insert(10, "she")
    dll.travel()

    dll.remove("zhangsan")
    dll.travel()
    dll.remove("he")
    dll.remove("she")
    dll.remove("her")
    dll.travel()

    # dll.remove(10000)

    print(dll.search("lisi"))  # True
    print(dll.search(10000))  # False

    # 双向链表反转
    temp = dll.reverse()
    temp.travel()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值