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; //返回的链表不需要头结点,直接从第一个元素值开始
}