Leetcode No.19 刪除連結串列的倒數第N個節點

weekingqi發表於2020-11-20

一、題目介紹

給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。

示例:

給定一個連結串列: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.
說明:

給定的 n 保證是有效的。

二、解題思路

由於我們需要找到倒數第 n 個節點,因此我們可以使用兩個指標 fast 和 slow同時對連結串列進行遍歷,並且 fast 比 slow 超前 nn 個節點。當 fast 遍歷到連結串列的末尾時,slow就恰好處於倒數第 n 個節點。

具體地,初始時 fast和 slow均指向頭節點。我們首先使用 fast 對連結串列進行遍歷,遍歷的次數為 n。此時,fast 和 slow 之間間隔了 n-1個節點,即 fast 比 slow超前了 n個節點。

在這之後,我們同時使用fast 和 slow對連結串列進行遍歷。當fast遍歷到連結串列的末尾(即 fast為空指標)時,slow 恰好指向倒數第 nn個節點。

如果我們能夠得到的是倒數第 n 個節點的前驅節點而不是倒數第 n 個節點的話,刪除操作會更加方便。因此我們可以考慮在初始時將slow 指向啞節點,其餘的操作步驟不變。這樣一來,當 fast遍歷到連結串列的末尾時,slow的下一個節點就是我們需要刪除的節點。

三、程式碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullpt

相關文章