/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode *dummy = malloc(sizeof(struct ListNode));
dummy->val = 0;
dummy->next = head;
struct ListNode *slowPtr = dummy;
struct ListNode *fastPtr = head;
for (int i = 0; i<n; i++) {
fastPtr = fastPtr->next;
}
while (fastPtr) {
slowPtr = slowPtr->next;
fastPtr = fastPtr->next;
}
slowPtr->next = slowPtr->next->next;
struct ListNode *ans = dummy->next;
free(dummy);
return ans;
}
快慢指针法,快指针先走n步,然后慢指针再和快指针一块走,但是一开始快指针指向头节点,慢指针指向哑节点,因为最后快指针会指向NULL,而不是最后一个节点,快慢指针之间的距离应该是n+1。
哑节点还有个用处,就是只有一个节点时,会将NULL返回回去,不用再单独判断了。