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


    }
};
相关推荐
再卷也是菜7 分钟前
第一章、线性代数(2)高斯消元法
线性代数·算法
NAGNIP9 分钟前
一文搞懂CNN经典架构-EfficientNet!
算法·面试
如何原谅奋力过但无声12 分钟前
【chap11-动态规划(上 - 基础题目&背包问题)】用Python3刷《代码随想录》
数据结构·python·算法·动态规划
小宇的天下1 小时前
Calibre LVS Circuit Comparison(2)
算法·lvs
迈巴赫车主1 小时前
求最大公约数-欧几里得算法(辗转相除法)
算法·最大公约数
lxl13071 小时前
C++算法(15)BFS_FloodFill
算法·宽度优先
小王C语言1 小时前
【基础IO】————简单设计一下libc库
前端·数据结构·算法
亦复何言??2 小时前
BeyondMimic 论文解析
人工智能·算法·机器人
WolfGang0073212 小时前
代码随想录算法训练营 Day20 | 回溯算法 part02
算法
YXXY3132 小时前
前缀和算法
算法