Python双向链表

prev,pre前驱节点
curr当前节点
later,next后继节点
class Node():
    def __init__(self,item):
        self.item=item
        #前驱
        self.pre=None
        #后继
        self.next=None

class Bilaterallinklist():
    #链表长度大小
    size=0
    def __init__(self):
        self.head=None
        self.size=0

    def is_empty(self):
        return self.head is None


    def length(self):
        return self.size

    def items(self):
        curr=self.head
        #遍历
        while curr is not None:
            #返回生成器
            yield curr.item
            curr=curr.next

    def add(self,item):
        """在头部添加节点"""
        #新建节点
        node=Node(item)
        if self.is_empty():
            self.head=node
        else:
            #新节点指向head
            node.next=self.head
            #head的pre指向node
            self.head.pre=node
            #更新头节点
            self.head=node
        #长度自增
        self.size+=1

    def append(self,item):
        """在尾部添加节点"""
        # 新建节点
        node=Node(item)
        #判空
        if self.is_empty():
            self.head=node
        else:
            #找到尾节点
            curr=self.head
            while curr.next is not None:
                curr=curr.next
            #尾节点的next指向node
            curr.next=node
            #node的pre指向curr
            node.pre=curr
        #长度自增
        self.size += 1

    def insert(self, index, data):
        """在指定位置添加结点"""
        if index < 0 or index > self.length():
            print("结点位置错误!")
            return False
        #头插
        elif index == 0:
            self.add(data)
        #尾插
        elif index == self.length():
            self.append(data)
        #中间插
        else:
            node = Node(data)
            curr = self.head
            prev = None
            # 移动到要添加的位置
            for i in range(index):
                prev=curr
                curr=curr.index
            # 新结点和它前面的结点互指
            prev.next = node
            node.pre = prev
            # 新结点和它后面的结点互指
            node.next = curr
            curr.pre = node
        #长度自增
        self.size += 1


    def remove(self,index):
        if index<0 or index>self.size:
            print("out of range")
            return
        if self.is_empty():
            return
        #删除第一个
        if index==0:
            self.head=self.head.next
            self.pre=None
        #删除最后一个
        elif index==self.size-1:
            #找到prev,
            prev=self.head
            for i in range(index-1):
                prev=prev.next
            curr=prev.next
            #prev的next指空
            prev.next=None
            #curr的pre指空
            curr.pre=None
        else:
            #找到prev和curr
            prev=self.head
            for i in range(index-1):
                prev=prev.next
            curr=prev.next
            prev.next=curr.next
            later=curr.next
            later.pre=curr.pre
        self.size-=1

    def find(self,index):
        curr=self.head
        for i in range(index):
            curr=curr.next
        return curr.item

    def update(self,index,item):
        curr=self.head
        for i in range(index):
            curr=curr.next
        curr.item=item

    def out(self):
        curr=self.head
        while curr is not None:
            print(curr.item,end=' ')
            curr=curr.next
        print()



if __name__=='__main__':
    l=Bilaterallinklist()
    l.append(10)
    l.append(20)
    l.append(30)
    #10 20 30
    l.add(520)
    #520 10 20 30
    l.insert(0,1314)
    #1314 520 10 20 30
    l.update(4,888)
    #1314 520 10 20 888
    l.out()
    for i in l.items():
        print(i,end=" ")
    print()
    #1314 520 10 20 888

 

# curr=self.head
# #找到链表的尾节点停止,最终curr指向最后一个节点
# while cur.next is not None:
#     cur = cur.next
# #遍历链表,最终curr指向尾节点的下一个,即None
# while curr is not None:
#     curr=curr.next

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值