移除链表元素
① 题目
给你一个链表的头节点 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, 104] 内
1 <= Node.val <= 50
0 <= val <= 50
② 思路
- 定义:前一个元素 (
pre
),当前元素(current
)为pre
的next指向的元素 - 当
current
的值等于要移除的元素的值 --> 将pre
的next指向current
的 next - 当
current
的值不等于要移除的元素的值 --> 将pre
的next指向current
- 最后是
pre
的next指向current
的next
![image-20211230195236533](https://gitee.com/xiaozhi-oos/save-img/raw/upload-img/img/20211230195237.png)
虚拟头结点的方式
![image-20211230195309608](https://gitee.com/xiaozhi-oos/save-img/raw/upload-img/img/20211230195310.png)
③ 代码实现
虚拟头节点
/**
* 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 xuni = new ListNode(-1, head);
// 上一个节点,相对来说
ListNode pre = xuni;
// 当前节点
ListNode current = xuni.next;
// 下一个节点不为空才往下执行
while (current != null) {
if (current.val == val) {
// 移除:将上一个元素的next指向当前元素的下一个元素
pre.next = current.next;
} else {
// 将上一个元素修改为当前元素
pre = current;
}
// 下一个元素要修改为当前元素的next
current = current.next;
}
return xuni.next;
}
}
无虚拟头结点
/**
* 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) {
/* 无虚拟头节点 */
// 循环判断一开始的元素是否等于val
while (head != null && head.val == val) {
// 等于val就要移除,直接拿下一个元素做第一个元素
head = head.next;
}
// 如果head为空,直接返回
if (head == null) {
return head;
}
// 上一个节点,相对来说
ListNode pre = head;
// 当前节点
ListNode current = head.next;
// 下一个节点不为空才往下执行
while (current != null) {
if (current.val == val) {
// 移除:将上一个元素的next指向当前元素的下一个元素
pre.next = current.next;
} else {
// 将上一个元素修改为当前元素
pre = current;
}
// 下一个元素要修改为当前元素的next
current = current.next;
}
return head;
}
}
原文地址:代码随想录