Leetcode 19. Remove Nth Node From End of List


第一次做這道題的時候使用的方法是:先掃描鏈表一次統計其長度len,再使用一個指針遍歷鏈表,從頭節點向後走len-n-1步,恰好指向待刪除節點的前一個節點再做處理。遇到待刪除節點爲頭節點——即n==len的情況單獨處理。




第二次做這道題時考慮最優算法,僅掃描鏈表一次的算法——使用快慢指針的思想,快指針先走一些步數慢指針再開始走,並且保持固定的距離。當快指針走到鏈表尾部的時候,慢指針恰好走到待刪除節點的前一個節點。然後再使用以上方法刪除待刪除節點。需要注意的是頭節點可能被刪除,所以在處理問題之前先添加dummy node會使問題變得更容易處理。代碼實現如下:


class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {

        ListNode *dummy =  new ListNode(-1);
        dummy->next = head;
        
        ListNode *slow = dummy,*fast = dummy;
        
        while(n-->0)
            fast = fast->next;
            
        while(fast->next !=NULL){
            fast = fast->next;
            slow = slow->next;
        }
        
        ListNode *tmp = slow->next;
        slow->next = tmp->next;
        delete tmp;
        return dummy->next;
    }
};


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