LinkedList与链表(有源码剖析)(一)

简介: LinkedList与链表(有源码剖析)

 💕"你笑的次数越多越好,因为你只有用笑才能不怀恶意地消灭罪恶。"💕

作者:Mylvzi

文章主要内容:数据结构之单链表的模拟实现

一.前言:

 

在上个顺序表的博客结尾针对ArrayList的缺陷留了一个思考题

大家可以去再看一下顺序表这篇博客https://blog.csdn.net/Mylvzi/article/details/133896470?spm=1001.2014.3001.5501

 因为ArrayList的底层是一段连续内存的空间,进行插入/删除操作的开销很大,因此ArrayList不适合用于"需要大量添加/删除数据的场景",因此Java中又引入了LinkedList,即链表结构

二.链表

1.链表的概念及结构

 链表是物理地址不连续的线性表,逻辑顺序是通过"链条"连接起来的

可以将链表想象成拉着很多节车厢的火车

注意:

1.链表是由一个个结点(Node)组成的,每个结点都是从堆上申请的

2.堆为每个结点分配内存地址,分配时是随机的,所以链表的物理结构是不连续的

链表的分类:

按照不同的性质可以有多种分类方法:

  • 按照是否有"头节点":带头和不带头
  • 按照是否循环:循环和不循环
  • 按照链表逻辑的方向:单向和双向

综上,链表可分为2 * 2 * 2 = 8种,在这里我们只需重点掌握两种链表即可

  • 无头单项非循环链表  面试常考
  • 无头双向非循环链表  Java中LinkedList的底层就是一个无头双向非循环链表

注意:这里说的"有无头节点"中的头节点不属于链表中的有效数据,他更像是一个“傀儡节点”,仅仅作为前驱使用

三.无头单向非循环链表的实现

1.链表的结构

 // 定义结点
 static class ListNode {
int val;// 结点存储的数据
        ListNode next;// 保存下一个结点的地址
 public ListNode(int val) {
 this.val = val;
         }
     }
 // 定义头节点
 public ListNode head = null;

2.链表的插入

因为链表的物理地址并不是连续的,所以我们插入数据的位置是多样性的,总的来说可以分为三种

  • 头插法:addFirst
  • 尾插法:addLast
  • 任意位置插入:addIndex

1.头插法

 头插法及创建一个新的结点,将此结点插入到第一个结点之前

 public void addFirst(int data) {
 ListNode newNode = new ListNode(data);
 // 头插法不需要考虑链表是否为空
         newNode.next = head;
         head = newNode;
     }

注意:

在链表中插入/删除数据时,最重要的一点是记得保存"下一节点",往往是先连接后面的结点,在进行其他的操作(如果不先连接后面的结点就会损失后面的所有节点火车一节车厢断开,则后面的车厢都断开了)

2.尾插法

尾插法即在链表的末尾添加一个新的结点

 public void addLast(int data) {
 ListNode newNode = new ListNode(data);
 // 如果为空  链表中没有一个节点 直接插入
 if(head == null) {
             head = newNode;
 return;
         }
 ListNode cur = head;
 // 让cur走到链表的最后一个节点
 while (cur.next != null) {
            cur = cur.next;
        }
         cur.next = newNode;
     }

LinkedList与链表(有源码剖析)(二)+https://developer.aliyun.com/article/1413522

目录
相关文章
|
20天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
48 4
|
1月前
|
存储 Java
HashMap之链表转红黑树(树化 )-treefyBin方法源码解读(所有涉及到的方法均有详细解读,欢迎指正)
本文详细解析了Java HashMap中链表转红黑树的机制,包括树化条件(链表长度达8且数组长度≥64)及转换流程,确保高效处理大量数据。
81 1
|
20天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
39 0
|
3月前
|
存储 Java
|
3月前
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
91 4
|
3月前
|
存储 测试技术
【初阶数据结构篇】单链表的实现(附源码)
在尾插/尾删中,都需要依据链表是否为空/链表是否多于一个节点来分情况讨论,目的是避免对空指针进行解引用造成的错误。
38 0
|
6月前
|
数据采集 Java 数据处理
Java流与链表:探索java.util.stream与LinkedList的交汇点
本文探讨了Java中流(Streams)与链表(LinkedList)的结合使用,展示了如何通过流处理LinkedList以实现高效数据操作。示例代码包括LinkedList的基本操作、使用Stream进行过滤和映射,以及结合HttpClient和代理IP实现网络爬虫。代理IP有助于绕过反爬机制,提高爬取效率。通过结合这些技术,开发者能编写出更简洁、高效的代码。
Java流与链表:探索java.util.stream与LinkedList的交汇点
|
6月前
|
算法 测试技术
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向循环链表
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向循环链表
|
6月前
|
存储 算法 Java
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向链表
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向链表
|
6月前
|
存储 Python
链表(Linked List)详解
链表(Linked List)详解
51 0