LeetCode 019. Remove Nth Node From End of List

Remove Nth Node From End of List

 

Given a linked list, remove the nth node from the end of list and return its head.

For example,

   Given linked list: 1->2->3->4->5, and n = 2.

   After removing the second node from the end, the linked list becomes 1->2->3->5.

Note:
Given n will always be valid.
Try to do this in one pass.

這道題要求刪除鏈表倒數第n個節點。思路就是用兩個指針,第一個指針先遍歷n步,然後兩個指針一起遍歷,等前一指針遍歷到鏈表最後一個節點的時候,那麼後一個指針則遍歷到了待刪除節點前面一個節點。

這道題唯一需要注意的是刪除的如果是頭結點該怎麼處理的問題。

這裏提供兩種思路,第一種就是直接處理。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution 
{
public:
    ListNode *removeNthFromEnd(ListNode *head, int n) 
    {
        ListNode *fore = head;
        ListNode *rear = head;
        ListNode *temp;
        int i = 0;
        while(i < n)
        {
            i++;
            fore = fore->next;
        }
        if(!fore)
        {
            temp = head;
            head = head->next;
            delete temp;
            return head;
        }
        while(fore->next) 
        {
            fore = fore->next;
            rear = rear->next;
        }

        //rear處於待刪除節點的前一個節點
        temp = rear->next;
        rear->next = rear->next->next;
        delete temp;
        return head;
    }
};

第二種是認爲在鏈表前再加上一個頭結點,等處理完畢後再刪掉該人爲添加的頭結點。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution 
{
public:
    ListNode *removeNthFromEnd(ListNode *head, int n) 
    {
        //爲了避免出現刪除頭結點的麻煩問題,我就在head前面再加上一個節點。
        ListNode *temp = new ListNode(0);
        temp->next = head;
        head = temp;
        ListNode *fore = head;
        ListNode *rear = head;
        int i = 0;
        while(i < n)
        {
            i++;
            fore = fore->next;
        }
        while(fore->next) 
        {
            fore = fore->next;
            rear = rear->next;
        }
        //rear處於待刪除節點的前一個節點
        temp = rear->next;
        rear->next = rear->next->next;
        delete temp;
        //前面添加了頭結點,現在必須將頭結點刪除
        temp = head;
        head = head->next;
        delete temp;
        return head;
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章