1. 程式人生 > 其它 >LC19-刪除連結串列倒數第N個節點

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

力扣題目連結

題目: 給你一個連結串列,刪除連結串列的倒數第 n 個結點,並且返回連結串列的頭結點 。如圖:

思路:

雙指標的經典應用,如果要刪除倒數第n個節點,讓fast移動n步,然後讓fast和slow同時移動,直到fast指向連結串列末尾。刪掉slow所指向的節點就可以了。

  • 定義fast指標和slow指標,初始值為虛擬頭結點,如圖:
  • fast首先走n + 1步 ,為什麼是n+1呢?因為只有這樣同時移動的時候slow才能指向刪除節點的上一個節點(方便做刪除操作),如圖:
  • fast和slow同時移動,直到fast指向末尾,如圖:
  • 刪除slow指向的下一個節點,如圖:

雙指標寫法(C):

;struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    typedef struct ListNode ListNode;
    ListNode *H=(ListNode *)malloc (sizeof(ListNode));
    H->next=head;
    ListNode *fast=H;
    ListNode *slow=H;
    n=n+1; //fast走n+1步
    while(n-- && fast!=NULL){
        fast = fast->next;
    }
    //確定好fast位置後,fast和slow同時移動
    while(fast != NULL){
        fast=fast->next;
        slow=slow->next;
    }
 slow->next=slow->next->next; //可以改成fast=slow->next; slow->next=fast->next;free(fast);
    return H->next;
}