我的疑问是当我制作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
和b.data
都将是5。如果你写b.data = 6
,那么a.data
也将是 6,因为a
和b
指的是同一件事。
但是如果你然后写b = Node(12)
会发生什么?现在,您所做的是创建一个新节点并b
引用它。但a
仍然指的是值为 6 的节点。所以,a.data = 6
和b.data = 12
.
更改b
所指的内容不会改变a
所指的内容。