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


    }
};
相关推荐
AI街潜水的八角4 分钟前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
白榆maple29 分钟前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少34 分钟前
数据结构——线性表与链表
数据结构·c++·算法
sjsjs1140 分钟前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
此生只爱蛋1 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
咕咕吖2 小时前
对称二叉树(力扣101)
算法·leetcode·职场和发展
九圣残炎3 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
lulu_gh_yu3 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
丫头,冲鸭!!!3 小时前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
Re.不晚3 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea