LeetCode 刪除連結串列的倒數第N個節點
阿新 • • 發佈:2019-01-04
刪除連結串列的倒數第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;
}