日新刷题 - 203. 移除链表元素 -

213 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

一、题目描述:

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

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

示例 1:

image.png

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

提示:

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

二、思路分析:

首先我们判断 next 节点是否为null,不为null。

那么判断 next 的 val 值是否等于我们指定的 val 值,如果等于,说明我们要移除这个节点。

我们需要将我们当前节点 cur 的 next 节点指向 next 节点的next,也就是下图中cur 指向的黑色节点 next ,然后我们将 next 向后移一位,这样我们就删除了指定要删除的节点。

如果不是我们指定的值,那么我们只需要将当前节点 cur 和 next 节点 向后移一位便可。

最后返回虚拟节点的 next 节点。

三、AC 代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if (head == null) {
            return head;
        }
        //定义一个虚拟节点
        ListNode dummyHead = new ListNode(0);
        //将虚拟节点指向头节点
        dummyHead.next = head;
        //当前节点为虚拟节点,next为当前节点的下一个节点
        ListNode cur = dummyHead, next = cur.next;
        //1,2,6,3,4,5,6
        while (next != null) {
            if (next.val == val) {
                //当前节点的下一个节点为next节点的下一个节点
                cur.next = next.next;
                //next节点向后移
                next = next.next;
            } else {
                //当前节点和下一个节点都向后移
                cur = cur.next;
                next = next.next;
            }
        }
        return dummyHead.next;
    }
}

范文参考:

203. 移除链表元素(五种方法) - 移除链表元素 - 力扣(LeetCode)