移除链表元素

文章目录

移除链表元素

题目描述

给你一个链表的头节点 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,欢迎关注,持续分享。

相关推荐
what丶k3 小时前
深度解析:以Kafka为例,消息队列消费幂等性的实现方案与生产实践
java·数据结构·kafka
爱敲代码的TOM5 小时前
基础算法技巧总结2(算法技巧零碎点,基础数据结构,数论模板)
数据结构·算法
惊讶的猫5 小时前
InnoDB选用B+树作为索引的原因
数据结构·b树
历程里程碑5 小时前
子串-----和为 K 的子数组
java·数据结构·c++·python·算法·leetcode·tornado
liu****5 小时前
Qt进阶实战:事件处理、文件操作、多线程与网络编程全解析
开发语言·网络·数据结构·c++·qt
寄存器漫游者6 小时前
数据结构 二叉树核心概念与特性
数据结构·算法
皮皮哎哟6 小时前
数据结构:从队列到二叉树基础解析
c语言·数据结构·算法·二叉树·队列
一匹电信狗6 小时前
【高阶数据结构】并查集
c语言·数据结构·c++·算法·leetcode·排序算法·visual studio
Hello World . .6 小时前
数据结构:二叉树(Binary tree)
c语言·开发语言·数据结构·vim
DeeplyMind7 小时前
少儿科技启蒙教材:《数据结构启蒙》
数据结构·计算机科学·少儿科技读物·蓝桥杯青少组