思路:
- 1、先找到倒数第n个节点的前一个节点
- 2、然后把上一个节点的next指向待删除节点的下一个节点
方法:双指针
- 技巧:删除头节点,都要在头节点前面创建一个虚拟的头节点,让其指向真正的头节点
步骤
1、创建快指针,让其从虚拟头节点开始先走n步
2、再创建慢指针
3、让两个指针每次同时往后走一步,当快指针走到尾节点时,慢指针走到的位置就是倒数第n+1个节点
4、此时慢指针指向的就是待删节点的前一个节点,此时将慢指针所在节点指向其下下个节点
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
# 1、创建虚拟头节点,防止删除的是头节点
dummy = ListNode(-1)
dummy.next = head # 让虚拟头节点指向真正的头节点
# 2、创建快慢指针,让快指针先走n步
first = dummy; second = dummy
while n:
first = first.next
n -= 1
# 3、快慢指针每次同时走一步,当快指针走到尾节点时停止(即快指针的下一个节点为空节点)
while first.next:
first = first.next
second = second.next
# 4、当前慢指针所在节点就是待删节点的前一个节点,让其指向其下下个节点,完成删除下一个节点的操作
second.next = second.next.next
# 5、返回虚拟头节点的下一个节点,注意不返回head,因为head可能被删除了
return dummy.next