19. 删除链表的倒数第 N 个结点
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
def getLength(head: ListNode) -> int:
length = 0
while head:
length += 1
head = head.next
return length
dummy = ListNode(0, head)
length = getLength(head) # 5
cur = dummy
for i in range(1, length - n + 1): #1 2 3
cur = cur.next
cur.next = cur.next.next
return dummy.next
在这段代码中,dummy 和 cur 实际上是指向同一个链表的。当我们创建 cur = dummy 时,cur 和 dummy 都指向链表的头部。然后在循环中,cur 指针向前移动,但它仍然在同一个链表上。所以当我们修改 cur.next 的时候,实际上也就修改了 dummy.next,因为它们都是指向同一个链表的。这就是为什么 dummy 的顺序会跟着 cur 的变化而变化的原因。
另外:
cur = cur.next
这个操作并不会修改链表本身,它只是将 cur
这个指针向链表的下一个节点移动。也就是说,cur
现在指向的是链表中的下一个节点。这个操作并不会改变链表节点的值或者节点之间的连接关系,所以链表本身并没有发生变化。但是,如果你修改了 cur
所指向的节点的值或者连接关系,比如 cur.next = cur.next.next
,那么链表就会发生变化。