我有一个单链列表L,并创建一个指向此列表P的指针。似乎有时修改P会更改实际列表,而有时修改P不会对实际列表L起作用,只会更改P指向。
假设我创建了一个指向L的指针,P = L(在python中)。进行类似P = P.next的操作会使L保持不变,但是P.next = P.next.next会改变L。类似地,通过修改P.data来更改存储在列表中的实际数据实际上会更改L.data。
为什么会这样?我觉得我缺少关于指针/引用的一些基本知识。
class Node:
def __init__(self,val):
self.val = val
self.next = None
def addNode(self,val):
root = self
while root.next is not None:
root = root.next
root.next = Node(val)
def iterateLL(self):
root = self
print
while root is not None:
print(str(root.val) + " ",end="")
root = root.next
print()
if __name__ =="__main__":
L = Node(1)
L.addNode(2)
L.addNode(3)
L.addNode(4)
# iterate through list and print:
L.iterateLL()
# changing value of pointer does not affect L
P = L
P = P.next
L.iterateLL() # L is unchanged
# changing "next" value of pointer does affect L
P = L
P.next = P.next.next
L.iterateLL() # now we've skipped node 2
# changing data of pointer does affect L
P = L
P.val = 10
L.iterateLL()
以上代码以以下输出执行(第一行显示原始链接列表,第二行显示更改指针P后列表未更改,而第三和第四行显示列表已更改)
1 2 3 4
1 2 3 4
1 3 4
10 3 4
这是怎么回事?为什么更改P不会影响L,但是更改P.next和P.val会呢?如果所有这些动作的行为都相同,则不会更改指针,或者总是更改链接列表(因此P = P.next应该通过摆脱第一个节点来修改L),还是从不更改链接列表(因此P.next = P.next.next应该保持L不变)?
我感觉到L.next是一个指针,就像P.next一样。因此,修改P.next最终会修改L.next指向(?)的内容。但是我觉得规则不清楚。