再記錄一下刪除鏈表的倒數第N個元素

之前一直沒關注過數據結構,最近猛刷一下。

刪除倒數第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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章