原題:給定鏈表,從列表的末尾刪除第n個節點並返回其頭。
解題思路:關鍵是如何找到倒數第n個節點,定義兩個指針fast和slow,讓fast先走n步,
然後讓fast和slow一起走,直到fast走到鏈表結尾,此時,slow指向倒數第n個節點的前一個節點,
然後,slow->next=slow->next->next,就可以跳過倒數第n個節點了,相當於刪除了倒數第n個節點。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode *fast=head;
struct ListNode *slow=head;
int i;
for(i=0;i<n;i++)
{
fast=fast->next;
if(fast == NULL) return head->next;
}
while(fast->next != NULL)
{
fast=fast->next;
slow=slow->next;
}
slow->next=slow->next->next;
return head;
}
注意細節:怎麼樣走到第n-1個節點,你要注意題目已經告訴我們要刪除的節點數是有效的,
所以,我們不必考慮萬一要刪除的節點數大於節點總數。如果要刪除的節點爲頭結點怎麼辦,
有一個小的細節必須注意,如果要刪除的節點是頭結點,那麼此時的fast肯定到了鏈表尾,所以我們只需要返回return head->next即可。
if(fast == NULL) return head->next;