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