4_线性表_链式存储

本文介绍了线性表的链式存储结构,包括节点定义、链表类型以及与顺序结构的区别。重点讲解了单链表在插入和删除操作上的时间性能,并提供了相关操作的Java代码实现。
摘要由CSDN通过智能技术生成

线性表之链式存储结构

链式存储结构

  • 定义:每个数据元素都有后继元素的存储地址
  • 相关概念:
    • 节点(Node):数据域和指针域组成的数据元素
  • 所需属性:
    • 数据域:存储数据元素数据的域
    • 指针域:存储后继元素位置的域
  • 图形:

    • 无头节点的链式结构

      这里写图片描述

    • 有头节点的链式结构

    这里写图片描述

  • 代码实现:

    public class LinkList<E> {
        private Node firstNode;
        class Node<E> {
            private E data;
            private Node next;
        }
    }
    

链式结构与顺序结构

  • 存储分配方式:
    • 顺序结构是连续的存储单元
    • 链式结构是任意位置的存储单元
  • 时间性能:
    • 查找:
      • 顺序存储结构 O(1)
      • 单链表 O(n)
    • 插入和删除:
      • 顺序结构:需要平均移动表长一半的元素 O(n)
      • 单链表:知道位置时,插入和删除为 O(1)
  • 空间性能:
    • 顺序结构:需要预分配存储空间,分大了会浪费,分小了易溢出
    • 单链表:不受存储空间的限制

操作

  • 插入节点

    这里写图片描述

  • 删除节点

    这里写图片描述

  • 代码实现

    • 插入

      • 插入首节点做特殊处理
      • 寻找到插入位置 i,并做判断是否符合插入条件
      • 将新节点的 next 指向 i,然后 i-1 的 next 指向新节点

        public boolean insert(int i, E element) {
            if(i == 0) {
                insertFirst(element);
                return true;
            }
            int j = 1;
            Node node = this.firstNode;
            while (node != null && j < i){
                node = node.next;
                j++;
            }
            if (node == null || j > i)
                throw new IndexOutOfBoundsException("下标: " + i + ",链表长度: " + this.length);
            Node<E> newNode = new Node<>(element);
            newNode.next = node.next;
            node.next = newNode;
            this.length++;
            return true;
        }
        
    • 删除

      • 删除首节点做特殊处理
      • 寻找到删除位置 i,并判断是否满足删除条件
      • 将要删除的节点的数据保存起来
      • 将 i-1 的 next 指向 i+1,然后释放要删除的节点 i

        public E delete(int i) {
            if(i == 0 && this.firstNode != null){
                return deleteFirst();
            }
            int j = 1;
            Node node = this.firstNode;
            while(node != null && j < i){
                node = node.next;
                j++;
            }
            if(node == null || node.next == null)
                throw new IndexOutOfBoundsException("下标: " + i + ",链表长度: " + this.length);
            Node<E> deNode = node.next;
            E element = deNode.data;
            node = deNode.next;
            deNode.next = null;
            deNode.data = null;
            this.length--;
            return element;
        }
        

说明

  • 除了单链表还有:静态链表、循环链表、双向链表
  • 代码还可以做很多优化,主要是了解单链表的特性
  • gihub源码链接 源码还有获取元素和在末尾添加元素的操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值