携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
一、题目描述:
203. 移除链表元素 - 力扣(LeetCode) (leetcode-cn.com)
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入: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;
}
}