地址:
描述: (进阶扫描一次实现)

思路:(快慢指针)
删除倒数第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版权协议,转载请附上原文出处链接和本声明。