LC19-删除链表倒数第N个节点

力扣题目链接

题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点 。如图:

思路:

双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。

  • 定义fast指针和slow指针,初始值为虚拟头结点,如图:
  • fast首先走n + 1步 ,为什么是n+1呢?因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作),如图:
  • fast和slow同时移动,直到fast指向末尾,如图:
  • 删除slow指向的下一个节点,如图:

双指针写法(C):

;struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    typedef struct ListNode ListNode;
    ListNode *H=(ListNode *)malloc (sizeof(ListNode));
    H->next=head;
    ListNode *fast=H;
    ListNode *slow=H;
    n=n+1; //fast走n+1步
    while(n-- && fast!=NULL){
        fast = fast->next;
    }
    //确定好fast位置后,fast和slow同时移动
    while(fast != NULL){
        fast=fast->next;
        slow=slow->next;
    }
 slow->next=slow->next->next; //可以改成fast=slow->next; slow->next=fast->next;free(fast);
    return H->next;
}
posted @ 2022-03-25 16:01  贝贝子  阅读(25)  评论(0编辑  收藏  举报