力扣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所指的地址节点被删除


    }
};
相关推荐
程序员buddha14 小时前
C语言数组详解
c语言·开发语言·算法
蒙奇D索大16 小时前
【算法】递归算法的深度实践:从布尔运算到二叉树剪枝的DFS之旅
笔记·学习·算法·leetcode·深度优先·剪枝
卡提西亚16 小时前
C++笔记-25-函数模板
c++·笔记·算法
ghie909016 小时前
MATLAB/Simulink水箱水位控制系统实现
开发语言·算法·matlab
多多*17 小时前
分布式系统中的CAP理论和BASE理论
java·数据结构·算法·log4j·maven
yuan1999717 小时前
基于粒子群优化(PSO)算法的PID控制器参数整定
算法
小白程序员成长日记17 小时前
2025.11.10 力扣每日一题
数据结构·算法·leetcode
hoiii18718 小时前
基于交替方向乘子法(ADMM)的RPCA MATLAB实现
人工智能·算法·matlab
fengfuyao98518 小时前
MATLAB的加权K-means(Warp-KMeans)聚类算法
算法·matlab·kmeans
循环过三天19 小时前
3.1、Python-列表
python·算法