python - 单个基本链表
问题描述
我的疑问是当我制作 b=c.next 时,这意味着 b 将指向节点 d。但是当我从头节点开始打印时,它给出的答案是 5、6、7、8。为什么我的行 b=c.next 没有执行。答案一定是 5,8 对吧?
class Node:
def __init__(self, data): # data -> value stored in node
self.data = data
self.next = None
a=Node(5)
b=Node(6)
c=Node(7)
d=Node(8)
a.next=b
a.next.next=c
a.next.next.next=d
b=c.next
print(a.data,b.data,c.data)
while a is not None:
print(a.data)
a=a.next
解决方案
您的行b=c.next
正在执行。如果你要写:
while b is not None:
print (b.data)
b=b.next
你会看到输出6 8
。它打印b.data
然后b.next.data
(与 相同d.data
)。
参考文献并不像您认为的那样起作用。当你创建初始节点时,你基本上有这个(=>
这里的意思是“指”):
a => Node5
b => Node6
c => Node7
d => Node8
这些分配创建新节点,并使变量引用这些节点。但是a
, b
, c
, 和d
是对节点的引用,而不是节点本身。
当您分配next
参考时:
Node5.next => Node6
Node6.next => Node7
Node7.next => Node8
您正在更改这些节点所指的内容。
最后,您更改b
,创建:
b => Node8
当您分配给 时b
,您是在告诉b
,“不要指代 ,而是Node6
开始指代Node8
。” 但Node5.next
还是指Node6
。
如果您想更改顺序以使其正常运行5,8
,则必须编写:
a.next = c.next
另一种看待它的方法是创建一个节点和两个引用,如下所示:
a = Node(5)
b = a
现在,很明显,a.data
andb.data
都将是 5。如果你写b.data = 6
, thena.data
也将是 6,因为a
andb
指的是同一件事。
但是如果你接着写会发生什么b = Node(12)
?现在您所做的是创建一个新节点并b
引用它。但是a
仍然指的是值为 6 的节点。所以,a.data = 6
和b.data = 12
。
改变b
所指的并不改变a
所指的。
推荐阅读
- javascript - 如何在 node.js 上的 Restful API 中设置编码 UTF-8 或 WINDOWS_CP_1251 并表达
- arrays - 通过引用传递数组 perl
- android - 如何使用来自 Activity 的数据更新小部件?
- asp.net-mvc - 如何在视图中使用 MVC 绑定选定的单选按钮值
- python - Pandas append() 和删除重复项会弄乱索引
- buildfire - 根据文档和 API 配置的 SSO 在 Postman 上运行良好,但只会在实际应用程序和模拟器上出错
- angular - 避免打字稿索引签名
- symfony - Symfony 4 - Webpack Encore 的一些困难
- java - Feign 无法连接到 localhost
- postgresql - 如何为 JSONB 字段 PostgreSQL 构造查询更新(我需要添加一个新元素)