为什么用 current.next 迭代对链表有效

why does iterating with current.next works on linked list

当我 运行 下面的代码和它 运行.

时,我试图跳过每个备用节点
def skip_alternate_node(head):
    current = head
    while current.next:
        current.next = current.next.next
    return current

我无法理解为什么 current.next 在我什至没有移动电流的情况下仍在工作。 换句话说,为什么 current.next = current.next.next 在我不做 current = current.next 的时候起作用? current.next 是否也是堆栈上的指针,就像指向堆上分配的 current 一样?

current.next 是对另一个列表节点的引用。每个节点都有一个 next 属性指向它之后的节点。因此,current.next.next是当前元素之后的第二个元素。

所以每次通过循环,你改变当前元素的 next link 指向下一个元素之后的元素。当它经过列表的最后一个元素时循环将停止,因此 current.next 将是 None,并且列表将只有原始的头元素。

该函数不应修改任何内容,也不需要循环。它应该只检查是否有下一个节点。如果有,应该是return后一个

def skip_alternate_node(head):
    return head.next and head.next.next

在您的代码中 current 仍然等于 head。唯一发生变异的是 current.next,最终会变成 None。所以这段代码是一种精心设计的方法:

head.next = None
return head

您的代码 returns 原始 head 引用,但它已发生变异,因此它已成为列表中的唯一节点。 head.

不再可访问所有其他节点

I was trying to skip every alternate node

保留一个节点和删除一个节点之间交替的代码,需要current遍历列表.所以将 current = current.next 添加到循环体中,并在 while 条件中添加额外的保护措施:

def skip_alternate_node(head):
    current = head
    while current and current.next:
        current.next = current.next.next
        current = current.next  #  <------ add this
    return head  # and return the original head reference