Leetcode019删除链表的倒数第N个数--------快慢指针

地址:

力扣

描述: (进阶扫描一次实现

思路:(快慢指针)

删除倒数第n个节点:

==核心思路就是找到倒数的第n个节点的前一个节点,即倒数第n+1个节点==

1.因为本题可能会要求我们删除头结点,所以我们需要建立一个哑节点

建立方式通常为:ListNode  *dummy=new ListNode(0,head);

2.让fast=dummy,先走n步

3.让fast走到链表尾,与此同时让slow=dummy这个指针与fast一起动,当fast走到链表尾时,slow指针指向的要删除数的前一个位置。

4.返回dummy->next;//假如我们返回的是head指针的话,会出现我们要将头结点删除掉的情况,此时就没有头结点了,而返回dummy->next永远指向链表的头部。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *dummy= new ListNode(0,head);//设置一个哑指针为了防止将头结点删除
        ListNode *fast=dummy;
        ListNode *slow=dummy;
   for(int i=0;i<n;i++){
       fast=fast->next;//先让fast指针走n步
   }
   while(fast->next)//开始让slow,和pre指针动,直到fast指针一直走到链表末尾
   {
       fast=fast->next; 
       slow=slow->next;//此时的slow指针指向的是要删除的结点前面一个节点
   }
   slow->next=slow->next->next;
   return dummy->next;//假如我们返回的是head指针的话,会出现我们要将头结点删除掉的情况,此时就没有头结点了,而返回dummy->next永远指向链表的头部。
    }

};


版权声明:本文为qq_52934831原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。