用Python实现简单的单向链表中实现append和iternodes功能时出现的一个小问题
正常实现:
class Node:
    def __init__(self,item,next = None,prev = None):
        self.item = item
        self.next = next
        self.prev = prev

    def __repr__(self):
        return '{} --> {}'.format(self.item ,self.next.item if self.next else None)

class LinkedList:
    def __init__(self):
        self.tail = None
        self.head = None

    def apend(self,item):
        node = Node(item) #执行apend 实例化Node
        tail = self.tail
        if tail is None:
            self.head = node
        else:
            tail.next = node
        self.tail = node
        return self

    def __repr__(self):
        pass

    def iternodes(self):
        current = self.head
        while current:
            yield current
            current = current.next

ll = LinkedList()
ll.apend('begin').apend('a').apend('b').apend('c').apend('end')
for x in ll.iternodes():
    print(x)

实现效果:


问题实现:

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

    def __repr__(self):
        return '{} --> {}'.format(self.item,self.next.item if self.next else None)

class LinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def append(self,item):
        n = Node(item)
        tail = self.tail
        head = self.head
        if head is None:
            head = n
        else:
            tail.next = n
        tail = n
        return self

    def iternodes(self):
        current = self.head
        while current:
            yield current
            current = current.next

ll = LinkedList()
ll.append('begin').append('1').append('2').append('3').append('end')
for x in ll.iternodes():
    print(x)

实现效果:


    ----------没有实现

问题所在点:

问题代码和正常代码均查看23行,是引用类型出了问题: 前者为问题代码,后者正常。


我们来理解一下链表中数据存储的状态以及对其的引用:

第一步:


第二步:


总结:

代码力图精简,不要追求所谓的看起来清楚而添加赘余变量,这样很可能导致自己都没有意识到错误产生了,能写一行决不写两行!

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

用Python实现简单的单向链表中实现append和iternodes功能时出现的一个小问题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭