class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
dummy = ListNode(0, head)
p = q = dummy
for _ in range(n + 1):
q = q.next
while q:
q = q.next
p = p.next
p.next = p.next.next
return dummy.next
逐步解释这段代码:
-
定义类和函数:
class Solution:
: 定义一个名为Solution
的类。def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
: 定义一个方法removeNthFromEnd
,它接受一个链表头节点head
和一个整数n
,返回一个链表头节点。
-
初始化哑节点:
dummy = ListNode(0, head)
: 创建一个哑节点dummy
,并将其next
指针指向链表的头节点head
。哑节点的值(这里为0
)是任意的,重要的是它有一个next
指针指向链表的第一个节点。
-
初始化双指针:
p = q = dummy
: 初始化两个指针p
和q
,并将它们都指向哑节点dummy
。这两个指针将用于遍历链表,其中q
会先走n+1
步,然后p
和q
会一起移动,直到q
到达链表的末尾。
-
移动
q
指针:for _ in range(n + 1):
: 使用一个循环来移动q
指针n+1
步。q = q.next
: 在循环中,将q
移动到链表的第n+1
个节点。
-
同步移动
p
和q
指针:while q:
: 当q
指针不为空时,循环继续。q = q.next
: 移动q
指针到下一个节点。由于q
最初比p
多走了n+1
步,所以在这个循环中,当q
到达链表末尾时,p
将指向倒数第n+1
个节点。p = p.next
: 移动p
指针到下一个节点。
-
移除节点:
p.next = p.next.next
: 此时p
指向倒数第n+1
个节点,因此p.next
指向要移除的倒数第n
个节点。通过改变p.next
的指向,我们跳过了要移除的节点,实现了删除操作。
-
返回结果:
return dummy.next
: 因为我们使用了哑节点,所以返回dummy.next
作为新的链表头节点。