Python进阶学习(6)—双向链表(加图解超详细)

双向链表

接下来我们再来看一个稍微复杂的,在实际的软件开发中,也更加常用的链表结构:双向链表。
单向链表只有一个方向,结点只有一个后继指针 next 指向后面的结点。而双向链表,顾名思义,它支持两个方向,每个结点不止有一个后继指针 next 指向后面的结点,还有一个前驱指针 prev 指向前面的结点。
在这里插入图片描述
操作
is_empty() 链表是否为空
length() 链表长度
travel() 遍历链表
add(item) 链表头部添加
append(item) 链表尾部添加
insert(pos, item) 指定位置添加
remove(item) 删除节点
search(item) 查找节点是否存在

其代码实现为

class Node(object):
    '''设置节点'''
    def __init__(self,item):
        self.item = item # 数据区
        self.prev = None # 上一个节点的链接
        self.next = None # 下一个节点的链接

class DoubleLinkList(object):
    '''双向链表'''
    def __init__(self,node = None):
        self.head = node

    def is_empty(self):
        '''判空'''
        return self.head == None

    def length(self):
        '''链表长度'''
        if self.is_empty():
            return 0 # 如果链表为空,返回0
        cur = self.head
        count = 0
        while cur:
            cur = cur.next
            count += 1
        return count

    def travel(self):
        '''遍历链表'''
        cur = self.head
        while cur:
            print(cur.item,end = ' ')
            cur = cur.next

    def add(self,item):
        '''向链表头部插入节点'''
        node = Node(item)
        if self.is_empty():
            self.head = node
        else:
            node.next = self.head
            self.head.prev = node
            self.head = node

    def append(self,item):
        '''向链表尾部插入节点'''
        node = Node(item)
        if self.is_empty():
            self.head = node
        else:
            cur = self.head
            while cur.next != None:
                cur = cur.next
            cur.next = node
            node.prev = cur

    def insert(self,pos,item):
        '''向链表插入节点'''
        if pos <= 0:
            self.add(item)
        elif pos > self.length() - 1:# 错误在这
            self.append(item)
        else:
            node = Node(item)
            count = 0
            pre = self.head
            while count < pos -1:
                count += 1
                pre = pre.next
            node.prev = pre
            node.next = pre.next
            pre.next.prev = node
            pre.next = node

    def remove(self,item):
        '''删除链表内的指定节点'''
        if self.is_empty():
            return True
        else:
            cur = self.head
            if self.head == item: # 如果删除的节点是首节点的话分为两种情况
                if cur == self.head:
                    if cur.next == None: # 当只有一个节点的时候
                        self.head = None
                    else: #当有多个节点时
                        cur.next.prev = None
                        self.head = cur.next
            else:
                while cur: # 当要删除的节点不是首节点时
                    if cur.item == item:
                        cur.prev.next = cur.next
                        if cur.next:
                            cur.next.prev = cur.prev
                        break
                    cur = cur.next

图解为
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值