之前一直沒關注過數據結構,最近猛刷一下。
刪除倒數第N個元素,也是用兩個指針,一個是先走,走了N-1次,因爲剛開始指向head,這一次就不用走了。然後再然back指針走,這樣front指針走到結尾的時候(指向最後的指針的時候)那麼back就是指向要刪除的指針了,又因爲刪除指針,要知道這個指針的前一個指針,所以要用一個指針,記錄back的前一個指針。當然還要判斷倒數第N個鏈表節點是否存在。下邊是代碼
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
//po是先走的指針,p1是後走的指針,p2是指向p1前邊的那個指針
Node p0,p1,p2;
int i=0;
p0=head;
for(i=1;i<n && p0!=NULL;i++)
{
p0=p0->next;
}
if(i==n && p0!=NULL)
{
p1=head;
p2=p1;
}
else//說明超限,N大於總的指針個數
{
return (Node)0;
}
while(p0->next!=NULL)//爲了使p0指向最後一個節點。如果p0!=NULL作爲判斷條件,那麼p0最後不是//最後的節點,而是NULL,p0指向最後的節點,p1才指向要刪除的節點
{
p2=p1;
p1=p1->next;
p0=p0->next;
}
if(p1==head)//如果刪除的是頭結點,就改變頭節點的指向
{
head=head->next;
free(p1);
}else
{
p2->next=p1->next;
free(p1);
}
return head;
}