• 09链表-单链表移除元素


    目录

    链表(Linked List)

    链表的数据结构

    单链表

    双链表

    循环链表

    链表的存储方式

    删除节点

    添加节点

    LeetCode之路——203. 移除链表元素

    分析:


    链表(Linked List)

    链表是一种线性数据结构,用于存储一系列元素,其中每个元素被包装在一个节点(Node)中,并通过指针(或引用)相互连接起来。

    链表的数据结构
    public class ListNode {
        int val;
        ListNode next;
        public ListNode() {}
        public ListNode(int val) {
            this.val = val;
        }
        public ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }
    单链表

    链表的每个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null。链表的入口节点成为链表的头节点,也就是head。

    双链表
    • 每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。

    • 双链表既可以向前查询也可以向后查询。

    循环链表

    循环列表就是链表的首尾相连。

    链表的存储方式
    • 数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。

    • 链表是通过指针域的指针链接在内存中各个节点。

    删除节点

    添加节点

    LeetCode之路——203. 移除链表元素

    给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

    示例 1:

    img

    输入:head = [1,2,6,3,4,5,6], val = 6
    输出:[1,2,3,4,5]

    示例 2:

    输入:head = [], val = 1
    输出:[]

    示例 3:

    输入:head = [7,7,7,7], val = 7
    输出:[]

    提示:

    • 列表中的节点数目在范围 [0, 104]

    • 1 <= Node.val <= 50

    • 0 <= val <= 50

    分析:

    关于链表的操作,比较常规的有两种:

    • 使用虚节点

      public ListNode removeElements(ListNode head, int val) {
          if (head == null) {
              return head;
          }
          // 因为删除可能涉及到头节点,所以设置dummy节点,统一操作
          ListNode dummy = new ListNode(-1, head);
          ListNode pre = 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)

    • 不适用虚节点

      class Solution {
          public ListNode removeElements(ListNode head, int val) {
              while(head != null && head.val == val) {
                  head = head.next;
              }
              ListNode current = head;
              while (current != null) {
                  // 对节点的操作
                  while (current.next != null && current.next.val == val) {
                      current.next = current.next.next;
                  }
                  current = current.next;
              }
              return head;
          }
      }
      • 时间复杂度:O(n)

      • 空间复杂度:O(1)

  • 相关阅读:
    戴尔大步进军经典量子计算混合模型
    【uniapp】签名组件,兼容vue2vue3
    非对称加密(RSA)详解
    libevent之evbuffer
    Sui与数据平台ZettaBlock达成合作,为其公测提供数据
    汇编基础(1)--ARM32
    Go 快速开发朋友圈助力项目
    Python之json模块
    【BOOST C++ 18 数字处理】(5)Boost.NumericConversion
    制造业进销存管理怎么做?
  • 原文地址:https://blog.csdn.net/Elaine2391/article/details/133419551