算法题解第六章

14 篇文章 0 订阅
13 篇文章 0 订阅

众所周知双链表就是有两个指针的特殊链表

不同于单链表 增加了一个向一个节点的指针,在查找方面更好,但是内存增加,而且删除方面变得更加复杂

老规矩,写一个节点

class Node:
    def __init__(self,item):
        self.item=item
        self.prev=None
        self.next=None
class DobuleLinkedList:
    def __init__(self):
        self._head=None

    def is_empty(self):
        if self._head is None:
            return True
        else:
            return False


    def get_length(self):
        number=0
        cur =self._head
        while cur :
            number+=1
            cur =cur.next
        return number

    def get_items(self):
        """遍历链表"""
        cur =self._head
        while cur is not None:
            yield cur
            #指针下移
            cur =cur.next

    #头插法
    def add_item(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_item(self,item):
        node =Node(item)
        cur =self._head
        if self.is_empty():
            self._head=node
            return
        #找到最后一个节点
        while cur.next:
            cur =cur.next
        cur.next = node
        node.prev=cur

    def insert(self,pos,item):
        if pos<=0:
            self.add_item(item)
        elif pos >len(self)-1:
            self.append_item(item)

        else:
            node =Node(item)
            number =0
            cur =self._head
            while number <pos -1:
                number+=1
                cur=cur.next
            node.next=cur.next
            cur.next.prev =node
            node.prev =cur
            cur.next =node


    def find(self,item):
        cur = self._head
        while cur:
            if cur.item == item:
                return True
            else:
                cur = cur.next

        return False

    def remove(self, item):
        if self.is_empty():
            return
        cur =self._head
        while cur:
            if cur.item == item:
                if cur ==self._head:
                    self._head = cur.next
                    if cur.next:
                        cur.next.prev=None
                else:
                    cur.prev.next = cur.next
                    #如果是最后一个节点
                    if cur.next:
                        cur.next.prev = cur.prev
                return
            else:
                cur=cur.next






##测试
newlist =DobuleLinkedList()
newlist.append_item(1)
newlist.append_item(2)
newlist.append_item(3)
# for i in newlist.get_items():
#     print(i.item)

newlist.add_item(7)
# for i in newlist.get_items():
#     print(i.item)
newlist.remove(2)
for i in newlist.get_items():
    print(i.item)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值