依舊是鏈表的應用
最開始看到這道題的時候,想法很暴力,遍歷一遍得到長度,然後再遍歷一遍刪除指定元素。後來看來大佬的題解發現可以使用雙指針的方法,只需要一次遍歷就可以刪除指定節點。
需要注意的一點是,雖然題目中已經說明 n 是有效數字,但是依舊有可能出現 fast 指針爲空的情況,即刪除第一個元素的時候。這個時候只需要返回 head->next 就可以了,之後就可以愉快的寫代碼了!
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
if(head == NULL || head->next == NULL){
return NULL;
}
struct ListNode* fast = head;
struct ListNode* slow = head;
for(int i = 0;i < n; i++){
fast = fast->next;
}
if(!fast){
return head->next;
}
while(fast->next){
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return head;
}