1. 程式人生 > >LeetCode 刪除連結串列的倒數第N個節點

LeetCode 刪除連結串列的倒數第N個節點

刪除連結串列的倒數第N個節點

給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。

示例:

給定一個連結串列: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.
說明:

給定的 n 保證是有效的。

進階:

你能嘗試使用一趟掃描實現嗎?

解法一:遍歷一遍並儲存下所有節點的指標,獲得要刪除的節點和刪除節點的下一節點,判斷刪除節點是否為頭接點,若是,則刪除頭結點並返回頭結點的下一節點,若否,則更改資料,刪除接點。

ListNode* removeNthFromEnd(ListNode* head, int
n) { if(head==NULL) return 0; vector<ListNode*> listVec; ListNode *temp=head; while(temp!=NULL) { listVec.push_back(temp); temp=temp->next; } temp=*(listVec.end()-n); if(n==listVec.size()) { head=temp->next; delete
temp; return head; } else { ListNode *temp2=*(listVec.end()-n-1); temp2->next=temp->next; delete temp; return head; }

解法二:效率較高

 ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode dummy(-1);
        dummy.next
=head; ListNode *p=&dummy,*q=&dummy; for(int i=0;i<n;i++)//讓q先走n步 q=q->next; while(q->next)//p,q一起走 { p=p->next; q=q->next; } ListNode *temp=p->next; p->next=p->next->next; delete temp; return dummy.next; }