思路: 删除倒数第 n 个节点,就是删除正数第 len - n 个节点,所以先计算出链表长度 len,然后找到第 len - n - 1个节点 cur,令 cur.next = cur.next.next
注意:当 len 为1时直接令 vHead.next = None
当 len 为 n 时,删除 head 节点
当 n 为1时,删除尾节点
class Solution(object):
def removeNthFromEnd(self, head, n):
vHead = ListNode(next=head)
cur = head
len = 1
while cur.next:
cur=cur.next
len+=1
cur = head
if len==1:
vHead.next=None
return vHead.next
if len==n:
vHead.next=vHead.next.next
return vHead.next
for i in range(len-n-1):
cur=cur.next
if n==1:
cur.next=None
return vHead.next
cur.next = cur.next.next
return vHead.next
题解采用双指针法:
首先令 fast 和 slow 指针指向 vHead,然后 slow 不动,令 fast 指针指向第 n+1 个节点,此时令 slow 和 fast 一起走,知道 fast 指向 None,将 slow.next = slow.next.next
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
# 创建一个虚拟节点,并将其下一个指针设置为链表的头部
dummy_head = ListNode(0, head)
# 创建两个指针,慢指针和快指针,并将它们初始化为虚拟节点
slow = fast = dummy_head
# 快指针比慢指针快 n+1 步
for i in range(n+1):
fast = fast.next
# 移动两个指针,直到快速指针到达链表的末尾
while fast:
slow = slow.next
fast = fast.next
# 通过更新第 (n-1) 个节点的 next 指针删除第 n 个节点
slow.next = slow.next.next
return dummy_head.next