[LeetCode]19. Remove Nth Node From End of List

19. Remove Nth Node From End of List

題意

給一個鏈表和一個數(shù)n, 刪掉倒數(shù)第n個數(shù).
比如給出1->2->3->4->52
返回 1->2->3->5
盡量保證只遍歷一次數(shù)組(one-pass)

解法:

常規(guī)思路是先完整遍歷一遍數(shù)組,得到數(shù)組的長度L.
然后再從頭遍歷一次, 刪除第L-n個數(shù).
但是這樣的做法不夠簡潔, 不符合one-pass的要求.

比較好的做法是通過快慢指針實現(xiàn).
快指針: 先從頭遍歷n個數(shù).
慢指針: 快指針遍歷完n個數(shù)后, 快指針距離鏈表尾部還剩L-n步, 如果此時慢指針與快指針同步遍歷, 那么就能實現(xiàn)慢指針遍歷L-n個位置.

坑:
鏈表為1->2, 刪除倒數(shù)第二個數(shù).
這種情況下, 快指針遍歷2步為NULL, 慢指針就始終指向1, 這樣就做不到刪除1這一項.
因為我們知道, 刪除第M項鏈表值, 需要將指針指向第M-1項.
解決這種問題的方法, 可以使用加一個空頭的方式, 即人為的把鏈表變?yōu)?br> 空->1->2, 然后同樣的從頭開始遍歷, 就能夠順利的跳出這個坑.

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if (!head)
            return head;

        ListNode *new_head = new ListNode(1);
        ListNode *fast = new_head, *slow = new_head;
        
        new_head->next = head;
        while (n--){
            fast = fast->next;
        }

        while (fast->next){
            slow = slow->next;
            fast = fast->next;
        }

        slow->next = slow->next->next;
        head = new_head->next;

        return head;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容