LeetCode#203-Remove Linked List Elements-移除链表元素
一、题目
删除链表中等于给定值 val
的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
二、题解
- 解法1:哨兵节点。
初始化一个哨兵节点 solider
,并将其 next
指针指向链表的头部;
初始化一个指针 prev
指向哨兵节点 solider
,作为前继节点;
比较前继节点的下一个节点和要删除的节点,若下一个节点是要删除的节点,则 prev->next = prev->prev->next
,反之则前继节点移动到下一个节点,即 prev = prev->next
;
最后返回 solider->next
。
时间复杂度:O(n);空间复杂度:O(1)。
class ListNode {
public $val = 0;
public $next = null;
function __construct($val) {
$this->val = $val;
}
}
/**
* @param ListNode $head
* @param Integer $val
* @return ListNode
*/
function removeElements($head, $val) {
$solider = new ListNode(null);
$solider->next = $head;
$prev = $solider;
while ($prev->next!= null) {
if ($prev->next->val == $val) {
$prev->next = $prev->next->next;
} else {
$prev = $prev->next;
}
}
return $solider->next;
}
- 解法2:不设置哨兵节点(虚拟头节点)
上面的解法是设置了一个虚拟头节点,那如果不设置虚拟头节点呢?
先判断链表的头节点是不是要删除的值,如果是,则将头节点向后移动,若移动完后头节点为空,则说明该链表的所有节点均为要删除的;
设置一个前继节点 prev
,并指向头节点,比较前继节点的下一个节点的值和要删除的值,若相等,则将前继节点的下一个节点指向前继节点下一个节点的下一个节点,反之则前继节点向后移动;
最后返回 head
即可。
function removeElements($head, $val) {
//如果开头就是要删的元素,则将头节点移动
while ($head->val == $val) {
$head = $head->next;
}
//如果链表全是要删除的元素,则头节点经过上述操作后为空
if ($head == null) {
return null;
}
$prev = $head;
while ($prev->next!= null) {
if ($prev->next->val == $val) {
$prev->next = $prev->next->next;
} else {
$prev = $prev->next;
}
}
return $head;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2018-04-11 ThinkPHP5.0源码学习之缓存Cache(二)