struct ListNode* removeNthFromEnd(struct ListNode* head, int n ) { if(head == NULL) //特殊情况,空链表 return head; struct ListNode* h = (struct ListNode*)malloc(sizeof(struct ListNode)); //新建一个头结点 h->next = head; //新头结点指针指向原链表头结点,其实是第一个元素 head = h; //更新真正的头结点为这个新建的头结点,为了应对删除的是第一个元素的情况 struct ListNode* fast = head; //新建快指针指向头结点 int i = 0; for(i = 0; i<n; i++) fast = fast->next; //快指针先走n步停下 struct ListNode* slow = head; //新建慢指针 while(fast->next != NULL){ fast = fast->next; //快慢指针一起走 slow = slow->next; } //struct ListNode* r = slow->next; //如果要真正删除这个结点,而不只是从链表中摘下来 slow->next = slow->next->next; //摘掉某个结点,就是跳过这个结点指向它的下一个结点 //free(r); //真正的删除是要释放结点空间 return h->next; //返回的链表不需要头结点,直接从第一个元素值开始 }