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

目录
相关文章
|
29天前
|
存储 Java
|
1月前
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
31 4
|
1月前
|
存储 测试技术
【初阶数据结构篇】单链表的实现(附源码)
在尾插/尾删中,都需要依据链表是否为空/链表是否多于一个节点来分情况讨论,目的是避免对空指针进行解引用造成的错误。
|
4月前
|
数据采集 Java 数据处理
Java流与链表:探索java.util.stream与LinkedList的交汇点
本文探讨了Java中流(Streams)与链表(LinkedList)的结合使用,展示了如何通过流处理LinkedList以实现高效数据操作。示例代码包括LinkedList的基本操作、使用Stream进行过滤和映射,以及结合HttpClient和代理IP实现网络爬虫。代理IP有助于绕过反爬机制,提高爬取效率。通过结合这些技术,开发者能编写出更简洁、高效的代码。
Java流与链表:探索java.util.stream与LinkedList的交汇点
|
4月前
|
算法 测试技术
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向循环链表
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向循环链表
|
4月前
|
存储 算法 Java
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向链表
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向链表
|
4月前
|
算法
【数据结构与算法 | 基础篇】模拟LinkedList实现的链表(无哨兵)
【数据结构与算法 | 基础篇】模拟LinkedList实现的链表(无哨兵)
|
4月前
|
存储 Python
链表(Linked List)详解
链表(Linked List)详解
37 0
|
3月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
3月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表