当前位置: 首页 > news >正文

19.删除链表的倒数第 N 个结点

在这里插入图片描述

题解:删除链表的倒数第 N 个节点(LeetCode 第 19 题)


一、题目描述

给定一个单链表,删除链表的倒数第 n 个节点,并返回链表的头节点。


二、解题思路

如果我们从头遍历链表,想找“倒数第 n 个节点”,必须知道整个链表长度。但那样就要 遍历两次链表

为了优化效率,这里我们使用一个非常常用的技巧:

双指针法(快慢指针) —— 只遍历一次!

技巧关键:

  • 创建两个指针 p1p2
  • 先让 p1 先走 n 步
  • 然后 p1p2 一起走,直到 p1 到达链表末尾;
  • 此时 p2 就正好在 倒数第 n 个节点的前一个节点

这样我们就可以通过 p2->next = p2->next->next 删除目标节点了。

为了简化边界处理(比如删除的是头结点),我们使用一个 虚拟头结点 dummy


三、代码实现

/*** 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 {
public:// 主函数:删除倒数第 n 个节点ListNode* removeNthFromEnd(ListNode* head, int n) {// 虚拟头节点,处理头节点被删除的情况ListNode* dummy = new ListNode(0);dummy->next = head;// 找到倒数第 n+1 个节点(即待删节点的前一个)ListNode* x = findFromEnd(dummy, n + 1);// 删除操作:跳过第 n 个节点x->next = x->next->next;// 返回新链表头return dummy->next;}// 辅助函数:找到倒数第 n 个节点ListNode* findFromEnd(ListNode* head, int n){ListNode* p1 = head;// 先让 p1 向前走 n 步for(int i = 0; i < n; ++i){p1 = p1->next;}// 然后让 p1 和 p2 一起走ListNode* p2 = head;while(p1 != nullptr){p1 = p1->next;p2 = p2->next;}// p2 就是倒数第 n 个节点return p2;}
};

四、时间复杂度分析

操作复杂度
单次遍历链表O(L),L 是链表长度
空间复杂度O(1),只使用了两个指针

所以这是一个 时间 O(n)、空间 O(1) 的解法。


http://www.dtcms.com/a/284296.html

相关文章:

  • 多线程--sem_wait(sem)特殊用法
  • 拿到安全工程师证后,能从事哪些岗位?
  • C函数实现strcopy strcat strcmp strstr
  • javax.servlet.http.HttpServletResponse;API导入报错解决方案
  • Kotlin集合与空值
  • 产品经理如何绘制流程图
  • Linux中的数据库操作基础
  • SpringMVC 执行原理
  • 79、【OS】【Nuttx】【启动】caller-saved 和 callee-saved 示例:r7 寄存器
  • Modbus
  • PyCharm2024安装包社区版和专业版
  • TESOLLO五指灵巧手遥操作解决方案
  • 使用 .NET Core 的原始 WebSocket
  • Spring整合MyBatis详解
  • 概率论与数理统计(四)
  • WCDB soci 查询语句
  • 缓存雪崩、缓存穿透,缓存击穿
  • 使用IntelliJ IDEA和Maven搭建SpringBoot集成Fastjson项目
  • 【git】使用教程
  • CommonJS和ES模块区别对比
  • API开发提速新方案:SmartBear API Hub与ReadyAPI虚拟化整合实践
  • ESP8266服务器建立TCP连接失败AT+CIPSTART=“TCP“,“192.168.124.1“,8080 ERROR CLOSED
  • JAVA后端开发——success(data) vs toAjax(rows): 何时用
  • 美拍sig逆向
  • 神经网络:模拟人脑的 AI 信息处理系统
  • 代码随想录打卡第十二天
  • Unity | AmplifyShaderEditor插件基础(第十集:噪声的种类+火焰制作-下)
  • 透过结构看时间——若思考清洗则表达有力
  • 开源Agent平台Dify源码剖析系列(六)核心模块core/agent之CotCompletionAgentRunner
  • Web开发 01