题目描述
给你一个链表的头节点 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
一、解题思路
删除结点的步骤:
①找到该结点的前一个结点
②进行删除操作
解题思路:
①用 head 表示当前节点。如果 head 不为空且节点值等于给定的 val,则需要删除。删除节点需要找到前一个节点prev,可以通过以下做法实现:
prev.next = head.next;
head = head.next;
②如果 head 的节点值不等于给定的 val,则保留head节点,将 prev 和 head 移动到下一个节点即可。
prev = head;
head = head.next;
③ 当 head 节点为空时,链表遍历结束,此时所有节点值等于 val 的节点都被删除。
具体实现方面,由于链表的头节点 head 有可能需要被删除,因此创建哑节点 dummy,令 dummy.next = head;
,初始化prev = dummy;
,然后遍历链表进行删除操作。最终返回 dummy.next
即为删除操作后的头节点。
二、代码
1. 移除链表元素
代码如下:
class Solution {
public ListNode removeElements(ListNode head, int val) {
if (head == null) {
return null;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
while (head != null) {
if (head.val == val) {
prev.next = head.next;
} else {
prev = head;
}
head = head.next;
}
return dummy.next;
}
}
2.测试数据
代码如下:
public class RemoveElements {
public static void main(String[] args) {
// 1
int[] arr1 = {1, 2, 6, 3, 4, 5, 6};
ListNode head1 = new ListNode(arr1);
System.out.println(head1);
System.out.println("==========删除后==========");
ListNode removeElements1 = new Solution().removeElements(head1, 6);
System.out.println(removeElements1);
System.out.println();
// 2
int[] arr2 = {};
ListNode head2 = new ListNode(arr2);
System.out.println(head2);
System.out.println("==========删除后==========");
ListNode removeElements2 = new Solution().removeElements(head2, 1);
System.out.println(removeElements2);
System.out.println();
// 3
int[] arr3 = {7, 7, 7, 7};
ListNode head3 = new ListNode(arr3);
System.out.println(head3);
System.out.println("==========删除后==========");
ListNode removeElements3 = new Solution().removeElements(head3, 7);
System.out.println(removeElements3);
}
}
3.链表结构
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
// 链表节点的构造函数
// 使用arr为参数,创建一个链表,当前的ListNode为链表头结点
public ListNode(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
this.val = arr[0];
ListNode cur = this;
//将数组值添加到链表中
for (int i = 1; i < arr.length; i++) {
cur.next = new ListNode(arr[i]);
cur = cur.next;
}
}
// 以当前节点为头结点的链表信息字符串
@Override
public String toString() {
StringBuilder res = new StringBuilder();
ListNode cur = this;
while (cur != null) {
res.append(cur.val + "->");
cur = cur.next;
}
res.append("NULL");
return res.toString();
}
}
4.复杂度分析
①时间复杂度:O(n)
②空间复杂度:O(1)
5.运行结果及执行时间