&LeetCode0019& 刪除鏈表的倒數第N個節點

題目

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

示例:

給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.

說明:
給定的 n 保證是有效的。

進階:
你能嘗試使用一趟掃描實現嗎?

來源:力扣(LeetCode

思路

首先,要考慮的是,如何找到倒數第N個節點,因爲只允許一次遍歷,所以不能用一次完整的遍歷來統計鏈表中元素的個數,而是遍歷到對應位置就應該移除了;
然後,需要用兩個指針,pre 和 cur 指針,先是 cur 指針先向前走N步,如果此時 cur 指向空,說明N爲鏈表的長度,則需要移除的爲首元素,那麼此時返回 head->next 即可,如果 cur 存在,再繼續往下走,此時 pre 指針也跟着走,直到 cur 爲最後一個元素時停止,此時 pre 指向要移除元素的前一個元素;
最後,再修改指針跳過需要移除的元素即可,

C++代碼

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) 
    {
        if (!head -> next)
            return NULL;
        
        ListNode *pre = head, *cur = head;

        for (int i = 0; i < n; ++i)
        {
            cur = cur -> next;
        }

        if(!cur)
        {
            return head -> next;
        }

        while (cur -> next)
        {
            cur = cur -> next;
            pre = pre -> next;
        }
        pre -> next = pre -> next -> next;
        return head;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章