移除链表元素

文章目录

移除链表元素

题目描述

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

相关推荐
wabs6663 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
Tongzhi20264 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
小玮看世界8 小时前
[Python]线段树与二分法
数据结构·算法
青山木12 小时前
Hot 100 --- 在排序数组中查找元素的第一个和最后一个位置
java·数据结构·算法·leetcode
依然鸣14 小时前
PTA团体程序设计天梯赛L2真题讲解L2-045-048
数据结构·c++·经验分享·学习·算法·pat考试·pat
CQU_JIAKE15 小时前
8.5【A】
数据结构·算法
Jasmine_llq15 小时前
《P13016 [GESP202506 六级] 最大因数》
数据结构·算法
白狐_79816 小时前
考研408算法设计题保命策略:链表专题暴力解法精讲(2015 & 2019真题实战)
考研·算法·链表
凉茶钱18 小时前
【数据结构】C语言实现队列
c语言·数据结构
zander25819 小时前
34. 在排序数组中查找元素的第一个和最后一个位置:用两个边界定位区间
数据结构·算法·leetcode