这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战
题目描述:
203. 移除链表元素 - 力扣(LeetCode) (leetcode-cn.com)
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例一
输入: head = [1,2,6,3,4,5,6], val = 6
输出: [1,2,3,4,5]
示例二
输入: head = [], val = 1
输出: []
示例三
输入: head = [7,7,7,7], val = 7
输出: []
提示:
- 列表中的节点数目在范围 内
1 <= Node.val <= 500 <= val <= 50
思路分析
删除结点的步骤
- 找到该结点的前一个结点
- 进行删除操作
三种方法
- 删除头结点时另做考虑(由于头结点没有前一个结点)
- 添加一个虚拟头结点,删除头结点就不用另做考虑
- 递归
迭代
我们选择添加一个虚拟节点来指向头节点,然后迭代链表。
用 temp 表示当前节点。如果 temp 的下一个节点不为空且下一个节点的节点值等于给定的 val,则需要删除下一个节点。
如果 temp 的下一个节点的节点值不等于给定的 val,则保留下一个节点,将 temp 移动到下一个节点即可。
当 temp 的下一个节点为空时,链表遍历结束,此时所有节点值等于 val 的节点都被删除。
AC代码
class Solution {
fun removeElements(head: ListNode?, `val`: Int): ListNode? {
// 虚拟头结点 dummy,使其指向 head,最终返回 dummy.next
val dummy = ListNode(0)
dummy.next = head
var temp = dummy
while (temp.next != null) {
if (temp.next.`val` == `val`) {
temp.next = temp.next.next
} else {
temp = temp.next
}
}
return dummy.next
}
}
递归
首先对头结点之后的节点进行删除,到最后由于头结点也可能需要删除,所以单独处理
AC代码
class Solution {
fun removeElements(head: ListNode?, `val`: Int): ListNode? {
var temp = head
temp?.next = removeElements(temp?.next, `val`)
if(temp?.`val` == `val`) {
return temp?.next
}else {
return temp
}
}
}
总结
很常规的链表的操作