用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行,是引用类型出了问题: 前者为问题代码,后者正常。


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

第一步:


第二步:


总结:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值