鱼C论坛

 找回密码
 立即注册
查看: 1187|回复: 1

python3 双向链表问题

[复制链接]
发表于 2021-3-20 18:18:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class Node:#实现了链表节点的类
    def __init__(self,key,value):
        self.key=key
        self.value=value
        self.next=None
        self.prev=None#上一个节点的引用为空

    def __str__(self):#直接输出对象ts时并没有按我们__str__方法中定义的格式进行输出,而用print输出的信息却改变了
        val='{%d: %d}' % (self.key,self.value)
        return val

    def __repr__(self):#重构__repr__方法后,不管直接输出对象还是通过print打印的信息都按我们__repr__方法中定义的格式进行显示了
        val = '{%d: %d}' % (self.key, self.value)
        return val


class DoubleLinkedList:
    def __init__(self,capacity=0xffff):
        self.capacity=capacity
        self.head=None
        self.tail=None
        self.size=0   #实现了双向链表

    #从头部添加
    def __add_head(self,node):
        if not self.head:
            self.head=node
            self.tail=node
            self.head.next=None
            self.head.prev=None
        else:
            node.next=self.head
            self.head.prev=node
            self.head=node
            self.head.prev=None
        self.size += 1
        return node  #返回增加的节点
    #从尾部添加
    def __add_tail(self,node):
        if not self.tail:
            self.head=node
            self.tail = node
            self.tail.next=None
            self.tail.prev=None
        else:
            self.tail.next=node
            node.prev=self.tail
            self.tail = node
            self.tail.next=node
        self.size += 1
        return node #返回当前添加的节点


    def __del_head(self):
        if not self.head:
            return
        node=self.head
        if node.next:
            self.head=node.next
            self.head.prev=None
        else:
            self.tail=self.head=None
        self.size-=1
        return node



    def __del_tail(self):#私有的函数
        if not self.tail:
            return #直接返回
        node=self.tail
        if node.prev:
            self.tail=node.prev
            self.tail.next= None
        else:
            self.tail=self.head=None
        self.size-=1
        return node

    #删除任意节点
    def __remov(self,node):
        #如果node==None,默认删除尾部节点
        if not node:
            node=self.tail
        if node == self.tail:
            self.__del_tail()
        elif node==self.head:
            self.__del_head()
        else:
            node.prve.next=node.next
            node.next.prve=node.prev
            self.size-=1
        return node


    #封装5个对外的api
    #弹出头部节点
    def pop(self):#公有的函数
        return self.__del_head()

    def append(self,node):
        return self.__add_tail(node)

    def append_front(self,node):
        return self.__add_head(node)

    def remove(self,node=None):
        return self.__remov(node)
    def print(self):
        p = self.head#用一个属性指向当前头部
        line = ''
        while p:
            line +='%s' % p
            p = p.next
            if p:
                line += '=>'
        print(line)

if __name__ == '__main__':
    l = DoubleLinkedList(10)
    nodes= []
    for i in range(10):
        node = Node(i,i)
        nodes.append(node)

    l.append(nodes[0])
    l.print()
    l.append(nodes[1])
    l.print()
    l.pop()
    l.print()
    l.append(nodes[2])
    l.print()
    l.append_front(nodes[3])
    l.print()
    l.append(nodes[4])
    l.print()
    l.remove(nodes[2])
    l.print()
    l.remove()
    l.print()









结果只输出{0:0}   

为何只能后面的代码都不输出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-20 19:05:57 | 显示全部楼层
class Node:#实现了链表节点的类
    def __init__(self,key,value):
        self.key=key
        self.value=value
        self.next=None
        self.prev=None#上一个节点的引用为空

    def __str__(self):#直接输出对象ts时并没有按我们__str__方法中定义的格式进行输出,而用print输出的信息却改变了
        val='{%d: %d}' % (self.key,self.value)
        return val

    def __repr__(self):#重构__repr__方法后,不管直接输出对象还是通过print打印的信息都按我们__repr__方法中定义的格式进行显示了
        val = '{%d: %d}' % (self.key, self.value)
        return val


class DoubleLinkedList:
    def __init__(self,capacity=0xffff):
        self.capacity=capacity
        self.head=None
        self.tail=None
        self.size=0   #实现了双向链表

    #从头部添加
    def __add_head(self,node):
        if not self.head:
            self.head=node
            self.tail=node
            self.head.next=None
            self.head.prev=None
        else:
            node.next=self.head
            self.head.prev=node
            self.head=node
            self.head.prev=None
        self.size += 1
        return node  #返回增加的节点
    #从尾部添加
    def __add_tail(self,node):
        if not self.tail:
            self.head=node
            self.tail = node
            self.tail.next=None
            self.tail.prev=None
        else:
            self.tail.next=node
            node.prev=self.tail
            self.tail = node
            self.tail.next=None
        self.size += 1
        return node #返回当前添加的节点


    def __del_head(self):
        if not self.head:
            return
        node=self.head
        if node.next:
            self.head=node.next
            self.head.prev=None
        else:
            self.tail=self.head=None
        self.size-=1
        return node



    def __del_tail(self):#私有的函数
        if not self.tail:
            return #直接返回
        node=self.tail
        if node.prev:
            self.tail=node.prev
            self.tail.next= None
        else:
            self.tail=self.head=None
        self.size-=1
        return node

    #删除任意节点
    def __remov(self,node):
        #如果node==None,默认删除尾部节点
        if not node:
            node=self.tail
        if node == self.tail:
            self.__del_tail()
        elif node==self.head:
            self.__del_head()
        else:
            node.prev.next=node.next
            node.next.prev=node.prev
            self.size-=1
        return node


    #封装5个对外的api
    #弹出头部节点
    def pop(self):#公有的函数
        return self.__del_head()

    def append(self,node):
        return self.__add_tail(node)

    def append_front(self,node):
        return self.__add_head(node)

    def remove(self,node=None):
        return self.__remov(node)
    def print(self):
        p = self.head#用一个属性指向当前头部
        line = ''
        while p:
            line +='%s' % p
            p = p.next #此时self.head是Node实例
            if p:
                line += '=>'
        print(line)

if __name__ == '__main__':
    l = DoubleLinkedList()
    nodes= [] #nodes=[node, node, node, node,.....]
    for i in range(10):
        node = Node(i,i)
        nodes.append(node)

    l.append(nodes[0])
    l.print()
    l.append(nodes[1])
    l.print()
    l.pop()
    l.print()
    l.append(nodes[2])
    l.print()
    l.append_front(nodes[3])
    l.print()
    l.append(nodes[4])
    l.print()
    l.remove(nodes[2])
    l.print()
    l.remove()
    l.print()


解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 07:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表