LeetCode.203 移除链表元素

438 阅读2分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

题目描述:

203. 移除链表元素 - 力扣(LeetCode) (leetcode-cn.com)

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例一

image.png

输入: 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
输出: []

提示:

  • 列表中的节点数目在范围 [0,104][0, 10^4] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

思路分析

删除结点的步骤

  1. 找到该结点的前一个结点
  2. 进行删除操作

三种方法

  1. 删除头结点时另做考虑(由于头结点没有前一个结点)
  2. 添加一个虚拟头结点,删除头结点就不用另做考虑
  3. 递归

迭代

我们选择添加一个虚拟节点来指向头节点,然后迭代链表。

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
        }
    }
}

总结

很常规的链表的操作

参考

移除链表元素 - 移除链表元素 - 力扣(LeetCode) (leetcode-cn.com)

203.移除链表元素(三种方法) - 移除链表元素 - 力扣(LeetCode) (leetcode-cn.com)