算法基础之链表:移除链表元素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;
    }
}
相关推荐
大熊背29 分钟前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline
一米阳光866133 分钟前
软考(中级)软件设计师核心笔记(9)算法——背包问题
笔记·算法·职场发展·软考·软件设计师·中级职称
晚风醉蝶44 分钟前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法
旖旎夜光1 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
小雪崩2 小时前
嵌入式学习 day25:哈希表及排序与查找
linux·c语言·数据结构·学习·排序算法
白露与泡影3 小时前
解密 Pi 的 Harness 工程:Agent 会话如何实现持久化与恢复
java·人工智能·算法
happyprince4 小时前
01-整体观-Codex全貌解读(源码)
算法·ai编程
俊基科技5 小时前
别自己写算法了,让这颗37.5毫米的模组替你“闭嘴干活”
神经网络·算法·硬件开发·ai降噪·语音模块·回音消除
_Narcissus_5 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径