1. 程式人生 > >連結串列-LeetCode19刪除連結串列中的第N個節點

連結串列-LeetCode19刪除連結串列中的第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