連結串列-LeetCode19刪除連結串列中的第N個節點
阿新 • • 發佈:2018-12-24
給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。
示例:
給定一個連結串列: 1->2->3->4->5, 和 n = 2. 當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現嗎?
分析:看到這個問題,第一反應,先求長度,再找節點,看一下進階,有更好的解決辦法,有更巧妙的解決辦法。下面是我參考的一個部落格,用來學習交流,發現博主寫的太好,考慮到了delete,避免的記憶體洩漏。
/** * 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) { //採用中間間隔不變的思想,設定兩個指標,進行一次遍歷連結串列,這裡的中間間隔就是輸入的n,太巧妙了。//q在前面走,p在後面追,最後他們兩個的位置,q走出了連結串列,p走到了要刪除節點的前一個節點。 //這裡拿龜兔賽跑比喻,這樣才有趣,烏龜在前面跑,兔子在後面追,他們永遠隔著n米,最後,烏龜跑出了整條路,拿了冠軍,兔子停在了蘿蔔(要刪除的節點)的前邊,準備拔蘿蔔。 ListNode* emptynode=new ListNode(0); emptynode->next=head; ListNode* p=emptynode; ListNode* q=emptynode;for(int i=0;i<n+1;i++){ q=q->next; } while(q!=NULL){ p=p->next; q=q->next; } ListNode* deletenode=p->next; p->next=deletenode->next; delete deletenode;//養成程式設計的好習慣,new-delete ListNode* node=emptynode->next; delete emptynode; return node; } };
參考:https://blog.csdn.net/hghggff/article/details/83243509