第一次做這道題的時候使用的方法是:先掃描鏈表一次統計其長度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;
}
};