剑指 Offer II 021. 删除链表的倒数第 n 个结点
剑指 Offer II 021. 删除链表的倒数第 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
进阶:能尝试使用一趟扫描实现吗?
解法
暴力, 两次遍历
- 第一次遍历, 记录当前链表结点数量
- 第二次遍历, 使被删除结点的前一个结点指向被删除结点的后一个结点
代码
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { int count = 0; ListNode* cur = head; while(cur != nullptr) { count ++; cur = cur->next; } if (count == n) return head->next; cur = head; count = count - n; while(--count) { cur = cur->next; } if (cur->next->next) cur->next = cur->next->next; else cur->next = nullptr; return head; } };
复杂度分析
- 时间复杂度: O(n) n为链表长度
- 空间复杂度: O(1)
左右指针
前后指针相距n个结点, 当右指针到达链表尾, 左指针到达要删除结点的前一个
代码
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* left = head, *right = head; while(n --) { if (right->next) right = right->next; else return head->next; // 去掉删除头的情况 } while(right->next != nullptr) { left = left->next; right = right->next; } left->next = left->next->next; return head; } };
复杂度分析
- 时间复杂度: O(n) n为链表长度
- 空间复杂度: O(1)
posted on 2023-07-24 00:39 SocialistYouth 阅读(4) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人