力扣Hot100-19删除链表的倒数第n个节点(双指针)

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

示例 1:

复制代码
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

复制代码
输入:head = [1], n = 1
输出:[]

示例 3:

复制代码
输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

**进阶:**你能尝试使用一趟扫描实现吗?

思路:要删除的节点Node为倒数第n个,当n已知后,要删除的节点与最后一个节点之间的距离是已知的,设为s。可以使用双指针p,q,将两个指针的距离调整为s+1,此时保持两个指针距离不变,对两个指针下移,直到指针q指向链表的最后一个节点时,指针p指向 要删除节点 的 前一个节点 。修改p->next=p->next->next便可实现删除倒数第n个节点。

cpp 复制代码
/**
 * 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 {
    //使用双指针,q指向最后一个节点时,p指向要删除节点的前一个节点,设第一个节点下标为0,此时下标p-q=n
    //Q1:当删除的是第一个节点如何处理
    //增加一个多余头节点
    //Q2:
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        int i=0;//记录间隔数
        ListNode* temp=new ListNode(-1);
        temp->next=head;
        ListNode* q=temp;
        ListNode* p=temp;
        while(i<n&&q!=NULL){
            q=q->next;
            if(q==NULL) return nullptr;//说明不存在
            i++;

        }
        //q还未到最后一个节点,则p,q一起下移
        while(q->next!=NULL){
            q=q->next;
            p=p->next;
        }
        //q为最后一个节点时,p->next为要删除的节点
        
        //p->next=p->next->next;//某些情况下,访问了空指针。这可能是因为 p->next 是 NULL 时,尝试访问 p->next->next 导致的
       ListNode *deletenode=p->next;
       p->next=deletenode->next;
       delete deletenode;

        return temp->next;//直接返回了 head,这在所有情况下都不正确。有可能head所指的地址节点被删除


    }
};
相关推荐
查理零世2 分钟前
【算法】数论基础——约数个数定理、约数和定理 python
python·算法·数论
汉克老师1 小时前
GESP2024年3月认证C++六级( 第三部分编程题(1)游戏)
c++·学习·算法·游戏·动态规划·gesp6级
闻缺陷则喜何志丹2 小时前
【C++图论】2685. 统计完全连通分量的数量|1769
c++·算法·力扣·图论·数量·完全·连通分量
利刃大大2 小时前
【二叉树深搜】二叉搜索树中第K小的元素 && 二叉树的所有路径
c++·算法·二叉树·深度优先·dfs
CaptainDrake2 小时前
力扣 Hot 100 题解 (js版)更新ing
javascript·算法·leetcode
一缕叶2 小时前
洛谷P9420 [蓝桥杯 2023 国 B] 子 2023 / 双子数
算法·蓝桥杯
甜甜向上呀3 小时前
【数据结构】空间复杂度
数据结构·算法
Great Bruce Young3 小时前
GPS信号生成:C/A码序列生成【MATLAB实现】
算法·matlab·自动驾驶·信息与通信·信号处理
Mryan20053 小时前
LeetCode | 不同路径
数据结构·c++·算法·leetcode
qy发大财3 小时前
验证二叉搜索树(力扣98)
数据结构·算法·leetcode·职场和发展