移除链表元素

文章目录

移除链表元素

题目描述

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

相关推荐
潼心1412o2 分钟前
数据结构(长期更新)第7讲:栈
数据结构
Fency咖啡29 分钟前
redis进阶 - 底层数据结构
数据结构·数据库·redis
2201_757830871 小时前
泛型的细节
java·开发语言·数据结构
墨雪不会编程2 小时前
数据结构—排序算法篇三
数据结构·算法·排序算法
飞鱼&4 小时前
java数据结构
数据结构·二叉树·散列表·红黑树
有意义5 小时前
为什么说数组是 JavaScript 开发者必须精通的数据结构?
前端·数据结构·算法
努力努力再努力wz5 小时前
【Linux进阶系列】:线程(下)
linux·运维·服务器·c语言·数据结构·c++·算法
ValhallaCoder5 小时前
Day33-动态规划
数据结构·python·算法·动态规划
小此方5 小时前
深度解析:环形链表——手撕面试经典题
数据结构·链表·面试