算法基础之链表:移除链表元素leetcode203

题目

题目难度:简单

题目分析

数组在物理的存储上也是连续的,而链表则不同,它在物理的存储上是不连续的,而是一种逻辑上的连续。

首先我们来看一下Java代码中链表中每个结点的结构:

java 复制代码
  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; 
      }
  }

可以看到,每个结点都有一个val,代表着这个结点存储的值,并且每一个结点都会通过next指向下一个结点。

如果我们想要删掉某一个结点,例如我们想要将B结点删掉,实际上就是让A直接连接C,跳过B,这边是链表的删除了。

那么此时问题又出现了,原本的结点B该怎么办呢?

对于C++等语言,我们需要手动去释放B的空间,但Java的话不需要,因为Java的垃圾回收机制已经替我们完成了这个步骤,因此只需要将A直接连接到C就可以了。

但是,这时候又出现了一个问题。

如果我们比对成功的那个值,是中间的结点,那很简单,只需要让它的上一个直接连接它的下一个。

但若这个比对成功的就是头结点该怎么办呢?头结点是没有上一个结点的,所以我们需要直接让头结点的指针指向它的下一位。

方法一

这样,我们在编写代码的时候就要进行情况的区分

情况一:比对成功的结点是头结点

情况二:比对成功的结点不是头结点

方法二

如果我们在头结点的前面增加一个虚拟的头结点,即我们自己创建一个结点,连接头结点,这样在进行比对和重新连接操作的时候,就不用区分两种情况了。

在结果返回的时候,我们只需要返回这个虚拟头结点的下一个结点,即为真正的头结点。

源代码

方法一的源代码

java 复制代码
class Solution {
    public ListNode removeElements(ListNode head, int val) {
    while (head != null && head.val == val) {head = head.next;}
    if (head == null) {return head;}
    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;
    }
}

方法二的源代码

java 复制代码
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        //设置一个虚拟的头结点
        ListNode virtualHead=new ListNode();
        virtualHead.next=head;

        ListNode k=virtualHead;
        while(k.next!=null){
            if(k.next.val==val){
                k.next=k.next.next;
            }else{
                k=k.next;
            }
        }

        return virtualHead.next;
    }
}
相关推荐
聚客AI14 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v17 小时前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工19 小时前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农20 小时前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了21 小时前
AcWing学习——双指针算法
c++·算法
moonlifesudo21 小时前
322:零钱兑换(三种方法)
算法
NAGNIP2 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队2 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法