237. 删除链表中的节点
有一个单链表的 head,我们想删除它其中的一个节点 node。
给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。
链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。
删除给定的节点。注意,删除节点并不是指从内存中删除它。这里的意思是:
给定节点的值不应该存在于链表中。 链表中的节点数应该减少 1。 node 前面的所有值顺序相同。 node 后面的所有值顺序相同。
示例 1:
输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9
难度: 中等
题解
删除链表中的节点的常见方法是定位到待删除的上一个节点,修改上一个节点的next指针,使其指向待删除节点的下一个节点,即可完成删除操作。
本题中,传入的参数node为要被删除的节点,根据题目中无法访问第一个节点head,因此就无法定位到要删除节点的上一个节点。注意到要被删除的节点不是链表的末尾节点,因此node->next不为空。
在给定节点node的情况下,可以通过修改node和node->next的值,将node->next->val赋给node,并删除最后一个节点。
1、将链表中第三个节点的值赋给第二个节点,将第四个节点的值赋个第三个节点,此时链表为
4->1->9->9
2在保证node下一个节点不为空的情况下删除链表的最后一个节点,此时链表为:
4->1->9
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ void deleteNode(struct ListNode* node) { while(1){ node->val=node->next->val; if(node->next->next==NULL){ node->next=NULL; break; } node=node->next; } }
复杂度分析
-时间复杂度:O(1)
-空间复杂度:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端