移除链表元素

文章目录

移除链表元素

题目描述

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

相关推荐
Hello_Embed22 分钟前
FreeRTOS 入门(四):堆的核心原理
数据结构·笔记·学习·链表·freertos·
烧冻鸡翅QAQ1 小时前
考研408笔记——数据结构
数据结构·笔记·考研
异步的告白1 小时前
C语言-数据结构-2-单链表程序-增删改查
c语言·开发语言·数据结构
Gorgous—l2 小时前
数据结构算法学习:LeetCode热题100-图论篇(岛屿数量、腐烂的橘子、课程表、实现 Trie (前缀树))
数据结构·学习·算法
热心市民小刘05054 小时前
11.18二叉树中序遍历(递归)
数据结构·算法
未若君雅裁4 小时前
LeetCode 18 - 四数之和 详解笔记
java·数据结构·笔记·算法·leetcode
小欣加油5 小时前
leetcode 429 N叉树的层序遍历
数据结构·c++·算法·leetcode·职场和发展
Kuo-Teng5 小时前
LeetCode 142: Linked List Cycle II
java·算法·leetcode·链表·职场和发展
星轨初途6 小时前
《数据结构二叉树之堆 —— 优先队列与排序的高效实现(2)(下)》
c语言·开发语言·数据结构·经验分享·笔记·性能优化
高山有多高7 小时前
堆应用一键通关: 堆排序 +TOPk问题的实战解析
c语言·数据结构·c++·算法