Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
示例
示例1:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例2:
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
提示
- 题目保证链表中节点的值互不相同
- 若使用 C 或 C++ 语言,你不需要
free或delete被删除的节点
难度:简单
此题为简单题,兄弟们可以重拳出击!
二、思路分析
众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。
题目解析
- 给定一个链表,并给定一个结点值,保证在链表中对应唯一结点,删除链表中对应的结点后返回。
- 数值在链表中对应唯一结点,因此可以从头到尾遍历链表,并判断结点值是否等于目标值,等于就删除结点
- 删除结点时操作:将前驱结点指向后置结点
- 如果头结点等于目标值,但是不存在前驱结点,因此可以在最开始对头结点进行单独判断
- 如果不想对头节点单独判断,可以新增结点指向头节点,这样头结点便可以进行相同逻辑
- 最终返回时需要返回新增结点的 next 指向结点
三、AC 代码
头结点单独处理
- 遍历链表节点,如果与目标节点相等就删除即可,需要考虑头节点相同时特殊情况
public ListNode deleteNode(ListNode head, int val) {
if(head.next == null || head.val == val) return head.next;
ListNode cur = head;
while(cur.next != null){
if(cur.next.val == val){
cur.next = cur.next.next;
break;
}
cur = cur.next;
}
return head;
}
头结点统一处理
- 删除链表中的节点,遍历比较删除,头节点前增加开始节点,不需要考虑头节点特殊情况
public ListNode deleteNode(ListNode head, int val) {
ListNode newHead = new ListNode(0);
newHead.next = head;
ListNode p = newHead;
while(p.next != null){
if(p.next.val == val){
p.next = p.next.next;
break;
}
p = p.next;
}
return newHead.next;
}
四、总结
知识点
- 对于链表操作,可以定义新结点指向头结点,这样头节点就不需要进行特殊处理
最后
阳春三月,算法刷起来!LeetCode 剑指 Offer。
简单题,不需要考虑太多,开干就是了。