链表操作疑问:cur指向cur.next后修改为何仍影响head?
为什么else分支修改cur为cur.next后,修改cur仍会影响head?
当在else语句中将cur替换为cur.next后,修改cur时head为何会发生变化?
我知道执行cur=head时是创建引用,此时对head关联节点的修改会同步(因为cur和head的id相同),但进入else分支后,cur被改为cur.next,此时cur和head的id不再相同,可回到if分支后,对cur的修改仍会影响head,这是为什么?
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class Solution: def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: cur=head while cur.val and cur.next: if cur.val==cur.next.val: cur.next=cur.next.next else: cur=cur.next print(cur) return head
核心原因是你修改的不是cur变量本身,而是cur指向的节点对象的属性:
- 当
cur = head时,cur和head指向同一个链表节点对象。 - 进入
else分支执行cur = cur.next后,cur确实指向了链表中的下一个节点,和head的指向不同了,但cur仍然是链表节点链中的一环,它的next属性关联着后续节点,而整个链表的根节点还是head。 - 回到
if分支时,你执行的是cur.next = cur.next.next——这是修改cur指向的那个节点的next属性,相当于在链表链上修改了节点之间的连接关系。这种修改会直接反映在整个链表结构中,而head作为链表的入口,自然能感知到整个链的变化。
举个实际场景:假设链表结构是 head -> 1 -> 1 -> 2,当cur移动到第一个1节点时,触发if分支修改cur.next跳过第二个1,链表就变成head ->1 ->2。此时cur虽然已经不是指向head本身,但修改的是链表节点的连接关系,head作为入口,整个链的结构已经改变,所以返回head时就能看到修改后的结果。
内容的提问来源于stack exchange,提问作者andy
相关产品推荐
相关产品推荐

