一、題目:
19.刪除鏈表中倒數第n個結點
給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。
示例:
給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
二、思路:
首先遍歷一遍鏈表,獲得鏈表長度length。再遍歷第二次鏈表,採用cnt計數,當cnt=length-n時,刪除當前指向的下一個結點。
三、代碼(C++):
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *p=head;
ListNode *q=head;
int length=0;
int cnt=0;
while(p)
{
++length;
p=p->next;
}
if(length==n)
{
head=head->next;
return head;
}
while(q)
{
++cnt;
if(cnt==length-n)
{
q->next=q->next->next;
break;
}
q=q->next;
}
return head;
}
四、擴展:只遍歷一次鏈表
首先用一個指針向前走n+1個位置,然後讓第二個指針和第一個一起向後遍歷,直到第一個指針爲空。刪除第二個指針指向的下一個結點。
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *h=new ListNode(0);
h->next=head;
head=h;
ListNode *p=h,*q=h;
for(int i=1;i!=n+2;i++)
{
p=p->next;
}
while(p)
{
q=q->next;
p=p->next;
}
q->next=q->next->next;
return head->next;
}