【题目解析】
采取双重遍历肯定是可以解决问题的,但题目要求我们一次遍历解决问题,那我们的思路得发散一下。
我们可以设想假设设定了双指针 slow 和 fast 的话,当 fast 指向末尾的 NULL,slow 与 fast 之间相隔的元素个数为 n 时,那么删除掉 slow 的下一个指针就完成了要求。
- 设置虚拟节点 result_ListNode 指向 head;
- 设定双指针 slow 和 fast ,初始都指向虚拟节点 result_ListNode;
- 移动 fast ,直到 slow 与 fast 之间相隔的元素个数为 n;
- 同时移动 slow 与 fast ,直到 fast 指向的为 NULL;
- 将 slow 的下一个节点指向下下个节点;
# 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:
result_ListNode = ListNode(0)
result_ListNode.next = head
fast, slow = result_ListNode, result_ListNode
for i in range(n):
fast = fast.next
while fast.next:
slow = slow.next
fast = fast.next
slow.next = slow.next.next
return result_ListNode.next