数据结构 | LinkedList与链表
创始人
2024-12-01 06:32:52
0

前言

  • ArrayList底层使用连续的空间,任意位置(尤其是0位置下标)插入或删除元素时,需要将该位置后序元素 整体 往前或往后搬移,故时间复杂度为O(N). 优点(给定一个下标,可以快速查找到对应的元素,时间复杂度为O(1))
  • 增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗.
  • 增容一般是呈2倍的增长,势必有一定的空间浪费.例如当前容量为100,满了要扩容到200,当我们再插入5个数据,后面没有数据插入了,那么就浪费了95个数据空间.

那么此时,我们就思考,有没有一种数据结构,可以随用随取,插入/删除数据可以不移动元素?👉👉 

于此Java集合中又引入了链表结构.

链表的概念及结构

概念

链表是一种物理存储结构上非连续存储结构, 数据元素的逻辑顺序是通过链表中的引用链接次序实现的.简单来说就是内存上非连续,逻辑上连续的一种存储结构.

生活中,火车是由许许多多的 车厢 组成 ;在链表中,则是由许多的 节点 组成.

        

  • 每一个节点都有地址. 是一个对象 ; null表示 不指向任何一个对象.
  • 第一个节点叫做 头节点head.可以认为head就是一个变量,该变量里面存了节点的地址. head是一个引用,这个引用指向个节点对象,就可以把链表里所有的元素都遍历.

结构 

组合一下有以下八种,但我们只需重点掌握 单向不带头非循环双向不带头非循环 结构.

 链表的实现

创建LinkedList类 实现IList接口

//模拟实现LinkedList链表 public class MySingleLinkedList implements IList {      //定义一个静态内部类 --节点     static class LinkedNode {         public int value;//数值域         public LinkedNode next;//next域 存放的是节点的地址          public LinkedNode(int value) {             this.value = value;         }     }     public LinkedNode head;//head是 链表的头节点 null      public void createList() {         LinkedNode node1 = new LinkedNode(12);         LinkedNode node2 = new LinkedNode(23);         LinkedNode node3 = new LinkedNode(34);         LinkedNode node4 = new LinkedNode(45);         node1.next = node2;//表示node1的下一个节点是node2 node2这个引用存储了地址         node2.next = node3;         node3.next = node4;         this.head = node1;//head指向了第一个节点的地址     }       @Override     public void display() {         LinkedNode cur = head;//定义临时变量         while(cur != null) {   //当头节点为null时 算把所有节点都遍历完了             System.out.print(cur.value + " ");             cur = cur.next;//从第一个节点走到下一个节点         }     }       @Override     public int size() {   //计算有多少个节点         int count = 0;         LinkedNode cur = head;         while(cur != null) {             count ++;             cur = cur.next;         }         return count;     }  }
public interface IList {         void addFirst(int data);         void addLast(int data);         void addIndex(int index,int data);         boolean contains(int key);         void remove(int key);         void removeAllKey(int key);         int size();         void clear();         void display(); } 

解析

  •                 
  1. 在构造方法中,为什么不初始化next域? 是因为,当我们去插入一个节点时,首先要实例化该节点,但在构造完成这个节点之后,不知道这个next会是谁,所以next域的值应该为null.
  2. head是链表的头节点.是链表的属性,不是节点的节点.   初始值也为null.
  •     
  1. 实例化了四个节点的对象.
  2. node1的下一个节点是node2 , 用代码表示为 node1.next = node2; 同时node2这个引用变量存储的是0x987.
  3. this.head = node1; 表示 head 指向了第一个节点的地址
  •   
  1. head = head.next ;从第一个节点走到 下一个节点.
  2. head = null ; 当head头节点为null时表示所有节点都被遍历了.
  3. 定义临时变量cur , 当遍历完后 head = null了就不指定头节点的位置了,我们希望的是 能够找到头节点的位置使得head始终指向第一个节点.
  4. 插入数据的时候 一定要先绑后面(该节点的下一个)的,因为可以通过遍历节点找到所有的节点 ; 而先把 头节点head这个引用指向该节点本身 , 再把该节点下一个指向head就找不到了,因为所指的是本身,后面的数据丢失了..

相关内容

热门资讯

正规平台有哪些,金花房卡批发九... 正规平台有哪些,金花房卡批发九哥联盟/房卡怎么搞Sa9Ix苹果iPhone 17手机即将进入量产阶段...
一分钟了解!牛牛房卡哪里有卖的... 今 日消息,九神联盟房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
头条推荐!金花房卡是正规的嫦娥... 嫦娥大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
微信房卡斗牛金花有透视吗/金花... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来享受...
两秒就懂!微信斗牛在哪里充值房... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享受...
头条推荐!金花房卡怎么购买旺旺... 头条推荐!金花房卡怎么购买旺旺大厅/微信链接房卡最低价格旺旺大厅是一款非常受欢迎的游戏,咨询房/卡添...
两秒就懂!拼三张微信房卡怎么购... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享...
微信炸金花房卡到哪里买/炸金花... 微信炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房...
ia攻略/牛牛房卡制作链接卡贝... 微信游戏中心:卡贝大厅/新上游房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或...
玩家攻略,金花房卡官网战神联盟... 战神联盟是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
科技实测!牛牛房卡哪里有卖的光... 科技实测!牛牛房卡哪里有卖的光明联盟/房卡怎么买Sa9Ix苹果iPhone 17手机即将进入量产阶段...
正规平台有哪些,游戏推荐斗牛房... 凤凰大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
微信炸金花链接怎样弄/微信房卡... 微信炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡...
两秒就懂!炸金花房卡怎么弄,乐... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
一分钟了解!斗牛房卡充值详心联... 详心联盟是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
头条推荐!牛牛充值房卡热玩吧/... 今 日消息,热玩吧房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单介...
ia攻略/游戏推荐牛牛房卡出售... 新海贝大厅/新神兽房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 ...
科技实测!微信金花房卡怎么弄天... 微信游戏中心:天蝎大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
金花房卡在哪获取/微信牛牛链接... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来享受...
两秒就懂!微信玩斗牛怎么买房卡... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享受...