程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Python 中链接列表的“添加”方法

发布于2024-11-30 18:02     阅读(61)     评论(0)     点赞(17)     收藏(3)


我正在尝试在 Python 上为链表编写一个添加方法,但它的行为并不如预期。

class linkedlist:
    def __init__(self):
       self.item=None
       self.next=None
    def add(self,val):
       self.next=self
       self.item=val

这不起作用。当我创建一个对象时:

myobj=linkedlist()
myobj.add(1)
myobj.add(2)
print(myobj.next.item)

给出的是 2,而不是我预期的 1。我哪里做错了?

我尝试查看在方法中用相同类型的另一个对象替换自身对象是否安全?但这没有帮助。


解决方案


您只有 1 个对象和 2 个指向它的引用。您需要先复制列表,然后再将其添加到列表中:

from copy import copy

class linkedlist:
    def __init__(self):
       self.item=None
       self.next=None
    def add(self,val):
       self.next=copy(self)
       self.item=val

myobj=linkedlist()
myobj.add(1)
myobj.add(2)
print(myobj.next.item) # prints 1

澄清一下:

print(myobj.item, id(myobj))
print(myobj.next.item, id(myobj.next))

使用您的代码:

2 140520931226768
2 140520931226768 # same object!

与我的:

2 140520931224368
1 140519593761456

更新:

首先,你的预期是错误的,你应该得到 3 和 2,这是你弹出头部后留在列表中的值。要获得这些结果,你需要更新指向a的内容。你可以在和方法return self的末尾添加,然后重新分配addpopa

from copy import copy

class linkedlist:
    def __init__(self):
       self.item=None
       self.next=None
    def add(self,val):
       self.next=copy(self)
       self.item=val
       return self
    def pop(self):
       self=copy(self.next)
       return self
    
a=linkedlist()
a = a.add(1)
a = a.add(2)
a = a.add(3)
a = a.add(4)
a = a.pop()
print(a.item)
a = a.pop()
print(a.item)

但在我看来,这相当丑陋,我宁愿使用 Allan 的方法......



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/2046402/7ad7c1442cf314d950ba/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

17 0
收藏该文
已收藏

评论内容:(最多支持255个字符)