前 言 : \textcolor{Green}{前言:} 前言:今天开始一下链表的题目训练,前面数组的训练还得进行,可以双面一起来。
移除链表元素
- 一、题目
- 二、代码及思路
题目来源
等 级 : 简 单 \textcolor{OrangeRed}{等级:简单} 等级:简单
一、题目
给你一个链表的头节点 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
二、代码及思路
有两种方式进行链表的操作:
- 用原来的链表进行
- 设置一个虚拟头节点进行
根据提示我们可以知道链表的值是不可能为负数的。所以我们可以搞一个虚拟的头节点,然后值为负数。
/**
* 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) {
ListNode l1 = new ListNode(-1,head);
ListNode pre = l1;
ListNode after = head;
while(after != null){
if(after.val == val){
pre.next = after.next;
}else{
pre = after;
}
after = after.next;
}
return l1.next;
}
}
这 是 大 神 的 解 法 , 我 的 解 法 虽 然 过 了 , 但 是 发 现 有 不 严 谨 的 地 方 。 这 个 参 考 一 下 这 个 \textcolor{red}{这是大神的解法,我的解法虽然过了,但是发现有不严谨的地方。这个参考一下这个} 这是大神的解法,我的解法虽然过了,但是发现有不严谨的地方。这个参考一下这个
/**
* 添加虚节点方式
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
public ListNode removeElements(ListNode head, int val) {
if (head == null) {
return head;
}
// 因为删除可能涉及到头节点,所以设置dummy节点,统一操作
ListNode dummy = new ListNode(-1, head);
ListNode pre = dummy;
ListNode cur = head;
while (cur != null) {
if (cur.val == val) {
pre.next = cur.next;
} else {
pre = cur;
}
cur = cur.next;
}
return dummy.next;
}
/**
* 不添加虚拟节点方式
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
public ListNode removeElements(ListNode head, int val) {
while (head != null && head.val == val) {
head = head.next;
}
// 已经为null,提前退出
if (head == null) {
return head;
}
// 已确定当前head.val != val
ListNode pre = head;
ListNode cur = head.next;
while (cur != null) {
if (cur.val == val) {
pre.next = cur.next;
} else {
pre = cur;
}
cur = cur.next;
}
return head;
}