【題目解析】
採取雙重遍歷肯定是可以解決問題的,但題目要求我們一次遍歷解決問題,那我們的思路得發散一下。
我們可以設想假設設定了雙指針 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