解题思路
- 算法思想:快慢指针法:先将二者形成n的距离差,然后同时等速前进,到达最终位置时,慢指针指向的下一个位置,即是目标要倒数n个位置之后的结点。
代码
- C++实现
// -*- coding: utf-8 -*-
// @ Date : 2021/5/20 13:14
// @ Author : RichardLau_Cx
// @ file : Richard.cpp
// @ IDE : Dev-C++
// @ Source : leetcode
/**
* 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 {
/**
* 算法思想:快慢指针法:先将二者形成n的距离差,然后同时等速前进,到达最终位置时,
* 慢指针指向的下一个位置,即是目的要倒数n个位置之后的结点(一趟扫描实现)。
*/
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
// 定义一个虚拟头结点(防止头结点改变后出错),给到值和下一个结点
ListNode *root = new ListNode(0, head);
ListNode *p = root; // 指向虚拟的头结点
ListNode *q = head; // 指向真正的头结点
for (int i=0; i < n; i++)
{ // 令q先向后移动n步(与p拉开距离n)
q = q->next;
}
while (q != nullptr)
{ // q不为空时,两个指针同时向后移动
p = p->next;
q = q->next;
}
// 此时(表面上)删除p结点所指的下一个结点(直接指向下下个结点)
p->next = p->next->next;
// 返回相当于倒数n个位置后的结点
return root->next;
}
};