LC19-刪除連結串列倒數第N個節點
阿新 • • 發佈:2022-03-25
題目: 給你一個連結串列,刪除連結串列的倒數第 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; }