【Python】python实现双向链表

一、定义与结构

双向链表(Doubly Linked List)是一种链式数据结构,每个节点(Node)包含三个部分:一个数据域(data),一个指向前驱节点的指针(prev),以及一个指向后继节点的指针(next)。双向链表的每个节点都链接到前一个节点和后一个节点,从而允许在两个方向上进行遍历。
双向链表的结构

+------+-----+------+       +------+-----+------+       +------+-----+------+
| prev |     | next | ----> | prev |     | next | ----> | prev |     | next |
+------+-----+------+       +------+-----+------+       +------+-----+------+

prev:指向前一个节点的指针。如果是头节点(head),则 prev 为 nil 或 None。
data:存储的数据。
next:指向下一个节点的指针。如果是尾节点(tail),则 next 为 nil 或 None。

二、特点与场景

特点
双向遍历:可以从头到尾遍历,也可以从尾到头遍历。
插入和删除操作:在已知位置进行插入和删除操作的时间复杂度为 O(1),因为不需要像数组那样进行大量元素的移动。
优点
相比单向链表,双向链表可以方便地进行反向遍历和操作。
插入和删除操作较为高效。
缺点
每个节点需要额外的空间来存储两个指针(prev 和 next)。
操作时需要维护两个指针,逻辑稍复杂。
使用场景
需要频繁插入和删除操作的场景。
需要在链表中从任意位置进行高效的前向和后向遍历的场景。

三、Python代码实现

定义节点结构

class Node:

    def __init__(self, data=None):
        self.data = data
        self.next = None
        self.prev = None

定义链表与方法

class DLinkedList:

    def __init__(self):
        self.head = None
    
    def append(self, data):
        if not self.head:
            self.head = Node(data)
        else:
            new_node = Node(data)
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node
            new_node.prev = current

    def prepend(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
        else:
            new_node.next = self.head
            self.head.prev = new_node
            self.head = new_node

    def move_to_front(self, key):
        ## 将元素移到头(为了实现lru算法而实现的方法)
        if not self.head:
            return
        current = self.head
        while current:
            if current.data == key:
                if current.prev is None:
                    return
                
                if current.prev:
                    current.prev.next = current.next

                if current.next:
                    current.next.prev = current.prev

                current.next = self.head
                current.prev = None
                self.head.prev = current
                self.head = current
                return
            current = current.next

    def back(self):
        # 删除最后一个元素
        if not self.head:
            return
        if self.head.next is None:
            self.head = None
            return
        current = self.head
        while current:
            current = current.next
        if current.prev:
            current.prev = None
        return current
        
    def display(self):
        data = []
        if self.head:
            current = self.head
            while current:
                data.append(current.data)
                current = current.next

        print(data)

测试

dl = DLinkedList()
dl.append(1)
dl.display()
dl.prepend(2)
dl.display()
dl.append(3)
dl.display()
dl.prepend(4)
dl.display()
dl.move_to_front(1)
dl.display()

结果

[1]
[2, 1]
[2, 1, 3]
[4, 2, 1, 3]
[1, 4, 2, 3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值