线性数据结构之链表

极客拾光
• 阅读 1007

什么是链表?

链表是一种线性数据结构,由不定数量的节点链接在一起,存储在不连续的内存空间中。按照节点的内部组成以及节点之后的链接形式可以分为单向链表双向链表以及循环链表

单链表
由各个节点通过一个Next引用链接在一起组成,每一个节点都存在后继节点(链尾除外),内存结构由数据域和Next 引用组成。
线性数据结构之链表

双向链表
由各个节点通过Next引用和 Prev引用链接在一起组成,每一个内存结构都存在前驱节点和后继节点(链头没有前驱,链尾没有后继),节点由数据域、Prev引用和 Next引用组成。
线性数据结构之链表

单向循环链表
由各个节点通过一个 Next引用 链接在一起组成,每一个节点都存在后继节点,节点由数据域和 Next 引用组成。
线性数据结构之链表

双向循环链表
由各个节点通过Next引用 和Prev引用 链接在一起组成,每一个内存结构都存在前驱节点和后继节点,节点由数据域、Prev引用和Next引用组成。
线性数据结构之链表

链表VS数组

底层存储结构上

线性数据结构之链表

数组需要一组连续的内存空间存储数据,而链表恰恰相反它并不需要连续的内存空间。

性能上

线性数据结构之链表

数组和链表是两种截然不同的内存组织方式。正是因为内存存储的区别,它们插入、删除、随机访问操作的时间复杂度正好相反

实现单链表

/**
 * 单向链表
 */
public class SingleDirectLinkedList<E> {
    //链表大小
    private int size;
    //链表的头结点
    private ListNode<E> head;

    /**
     * 查询链表大小
     * @return
     */
    public int getSize(){
        return size;
    }

    /**
     * 链表初始化
     */
    public SingleDirectLinkedList() {
        this.size = 0;
        this.head = new ListNode(null);
    }

    /**
     * 在指定位置插入节点
     * @param index
     * @param val
     */
    public void add(int index,E val){
        //检查插入的位置下标
        if(index < 0 || index > size)
            throw new RuntimeException("插入位置不存在");
        ListNode listNode = new ListNode(val);
        ListNode curr = head;
        ListNode after = null;
        //查找插入节点的前置节点
        for (int i = 0; i < index ; i++)
            curr = curr.next;
        //查找插入节点的后置节点
        if(curr != null)
            after = curr.next;
        //插入
        listNode.next = after;
        curr.next = listNode;
        size++;
    }

    /**
     * 删除指定下标位置的节点
     * @param index 下标位置信息
     */
    public void del(int index){
        ListNode prev = head;
        ListNode curr = null;
        ListNode after = null;
        if(index < 0 || index > size)
            throw new RuntimeException("删除位置不存在")
        //被删除节点的前置节点
        for (int i = 0; i < index - 1 ; i++) {
            prev = prev.next;
        }
        //被删除节点
        curr = prev.next;
        //被删除节点的后置节点
        if(curr.next != null)
            after = curr.next;
        //删除节点
        prev.next = after;
        curr = null;
        size --;
    }
    

    class ListNode<E>{
        private E val;
        private ListNode<E> next;

        public ListNode(E val) {
            this.val = val;
        }
    }
}

链表和数组相比可能略显复杂一点,由单链表衍生出来的链表种类也在上面一一列举出来了,文章中也对数组和链表的相关操作的性能做了一些比较,在日常开发中,可以根据使用场景以及性能要求来选择使用。

点赞
收藏
评论区
推荐文章
22 22
4年前
【数据结构之链表】详细图文教你花样玩链表
【系列文章推荐阅读】0.提要钩玄文章已经介绍了链式存储结构,介绍了链式存储结构的最基本(简单)实现——单向链表。单向链表,顾名思义,它是单向的。因为单链表的每个结点只有一个数据域和一个指针域,而该指针域只存储了下一个结点的地址,所以我们只能通过某结点找到其直接后继结点,却不能通过某节点找到其直接前驱结点。此外,由于单链表到尾结点(链表的最后一
Souleigh ✨ Souleigh ✨
4年前
JS 实现单链表
要存储多个元素,数组(或列表)可能是最常用的数据结构。但这种数据结构有一个缺点:(在大多数语言中)数据的大小是固定的,从数组的起点或中间插入或移除项的成本很高。  链表存储有序的集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。  相对于传统的数组,链表的一个好处是
Stella981 Stella981
3年前
Redis基本操作——队列 List(原理篇)
Redis基本操作——List(原理篇)  学习过数据结构的同学,一定对链表(LinkedList)十分的熟悉。相信我们自己也曾经使用过这种数据结构。  链表分为很多种:单向链表,双向链表,循环链表,块状链表\1(https://www.oschina.net/action/GoToLink?url
Wesley13 Wesley13
3年前
275,环形链表 II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。如果 pos 是 1,则在该链表中没有环。说明:不允许修改给定的链表。示例1:输入:head3,2,0,4,pos
Stella981 Stella981
3年前
LinkedList
Base:JDK1.81、LinkedListLinkedList也是一个比较常见的数据结构,链表。在C/C中,链表也是一个典型的线性结构,链表分为单向跟双向的两种链表。在java里面的LinkedList是一个双向的链表。链表最好的好处就在于来一个数据加一个长度,没有多余的冗余,也是支
Wesley13 Wesley13
3年前
Java源码解析之LinkedList源码剖析(基于JDK1.8)
    学过数据结构的都知道双端队列(链表),没学过的也没有关系,下面我先介绍一下双端队列(链表),为什么要介绍它了,因为LinkedList本质上就是一个双端队列(链表)。一. 双端队列(链表)的介绍1. 如下图:双端队列(链表)中单个节点对应的结构!(https://oscimg.oschina.net/oscn
Wesley13 Wesley13
3年前
Java实现单链表反转操作
单链表是一种常见的数据结构,由一个个节点通过指针方式连接而成,每个节点由两部分组成:一是数据域,用于存储节点数据。二是指针域,用于存储下一个节点的地址。在Java中定义如下:publicclassNode{privateObjectdata;//数据域privateNodenext;//指针域publicNo
Stella981 Stella981
3年前
LeetCode 142 环形链表 II python
题目描述给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。说明:不允许修改给定的链表。样例如果不是环,则输出None如果是环,则输出入口节点想法:通过ac141,知道慢节点循环的次数就是环的长度无环的情况不用考虑,直接返回No
Wesley13 Wesley13
3年前
D1
1\.数据结构  1.1线性结构  (1)最常用的数据结构,特点是数据元素之间存在一对一的线性关系  (2)有两种不同的存储结构,即顺序存储结构和链式存储结构    顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的    链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息
菜园前端 菜园前端
2年前
什么是链表?
原文链接:什么是链表?链表是有序的数据结构,链表中的每个部分称为节点。可以首、尾、中间进行数据存取,链表的元素在内存中不必是连续的空间,每个节点通过next指针指向下一个节点。优点链表的添加和删除不会导致其余元素位移。缺点无法根据索引快速定位元素。数组和链
深度学习 深度学习
1个月前
头插法实现的树结构:链表式多叉树实现指南
一、简介和特点头插法实现的树是一种使用子节点的多叉。本文实现的树类通过链表头插法高效管理子节点关系,适合需要频繁插入子节点的场景。‌主要特点‌:1.动态子节点管理:使用链表存储子节点1.高效插入:头插法实现O(1)的子节点插入1.泛型支持:模板类设计支持多