题目
题解
第一想法
创建快慢指针。快指针在慢指针后面n个位置。当快指针指向尾结点的下一个结点即为NULL的时候,慢指针指向的刚好是倒数第n个结点。
但是本题需要删除倒数第n个结点,所以慢指针应该指向倒数第n个结点的前驱结点。
因此快指针还需要往后走一个位置,这样当快指针到NULL的时候,慢指针刚好在倒数第n个结点的前驱结点。
此时将慢指针所指向的结点的下一个结点的下一个结点,赋值给慢指针所指向的结点的下一个结点(开始绕口令),其实也就是
slow -> next = slow -> next -> next; 这样就可以实现删除倒数第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;
for(int i=0;i<n;i++){
fast = fast -> next;
if(fast == NULL){
//如果此时快指针为空,那需要删除的结点就是头结点,
//删掉头结点后头结点的下一个结点成为新的头结点,直接返回。
return head -> next;
}
}
fast = fast -> next;
while(fast != NULL){
fast = fast -> next;
slow = slow -> next;
}
slow -> next = slow -> next -> next;
return head;
}