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


    }
};
相关推荐
zh_xuan1 小时前
LeeCode 40.组合总和II
c语言·数据结构·算法
都叫我大帅哥1 小时前
动态规划:从懵逼到装逼,一篇让你彻底搞懂DP的终极指南
java·算法
艾莉丝努力练剑2 小时前
《递归与迭代:从斐波那契到汉诺塔的算法精髓》
c语言·学习·算法
超级皮皮7 小时前
力扣热题之stack
算法·leetcode·职场和发展
weixin_470740368 小时前
某算法的python执行汇编
汇编·python·算法
是乐谷9 小时前
燧原科技招大模型训练算法工程师
科技·算法
YuTaoShao9 小时前
【LeetCode 热题 100】139. 单词拆分——(解法一)记忆化搜索
java·算法·leetcode·职场和发展
圣保罗的大教堂9 小时前
leetcode 1277. 统计全为 1 的正方形子矩阵 中等
leetcode
小马学嵌入式~10 小时前
数据结构:队列 二叉树
c语言·开发语言·数据结构·算法
焊锡与代码齐飞11 小时前
嵌入式第三十五课!!Linux下的网络编程
linux·运维·服务器·开发语言·网络·学习·算法