移除链表元素

文章目录

移除链表元素

题目描述

给你一个链表的头节点 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
输出:[]

解题思路

还记得数组的移除元素吗?是使用双指针的不断覆盖完成。

而链表的移除,只需改变改节点的前一个节点的取向指向改节点的下一个节点就可以了。代码:pre.next = cur.next;如下图:

在解题的过程中,还存在一个问题,如果要删除头指针呢?头指针没有前一个节点该如何删除呢?

此时有创建虚拟头指针的方法与不创建虚拟头指针的方法。

不创建虚拟头指针,就是需要对头指针进行一次单独的处理。

详细代码如下:

java 复制代码
//不使用虚拟头节点
     public ListNode removeElements(ListNode head, int val) {
    //     //先判断头节点
         while(head != null && head.val == val){  //注意这里要使用while,判定条件要注意
             head = head.next;
      }
        //校验
       if(head == null){   // 多进行一次判断 
            return null;
        }

       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;
  }

时间复杂度为O(n)

空间复杂度O(1)

创建虚拟头指针的详细代码如下:

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

        //虚拟头节点
        ListNode dummy = new ListNode(-1,head);

        ListNode pre = dummy; //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)

我是小辉,24 届毕业生。当下是找工作ing,欢迎关注,持续分享。

相关推荐
清风wxy30 分钟前
C语言基础数组作业(冒泡算法)
c语言·开发语言·数据结构·c++·windows·算法
程序员东岸1 小时前
避坑修链表:从顺序表到单链表的那点事儿(含可跑示例与小项目串联)
数据结构·笔记·学习·程序人生·链表
懒羊羊不懒@1 小时前
算法入门数学基础
c语言·数据结构·学习·算法
OKkankan2 小时前
list的使用和模拟实现
数据结构·c++·算法·list
爱吃生蚝的于勒3 小时前
【Linux】零基础学会linux环境基础开发工具使用(yum,vim,makefile,gdb)
linux·服务器·数据结构·c++·蓝桥杯·编辑器·vim
Chloeis Syntax17 小时前
栈和队列笔记2025-10-12
java·数据结构·笔记·
404未精通的狗17 小时前
(数据结构)线性表(下):链表分类及双向链表的实现
数据结构·链表
晨非辰19 小时前
【面试高频数据结构(四)】--《从单链到双链的进阶,读懂“双向奔赴”的算法之美与效率权衡》
java·数据结构·c++·人工智能·算法·机器学习·面试
im_AMBER19 小时前
数据结构 03 栈和队列
数据结构·学习·算法
卿言卿语21 小时前
CC1-二叉树的最小深度
java·数据结构·算法·leetcode·职场和发展