LinkedList 双向链表

目录

1、实现自己的双向链表 (不带头)

1.1、display、size、contains方法

1.2、头插法尾插法

1.3、任意位置插入一个节点

1.4、删除第一个值为key的节点

1.5、删除所有值为key的节点

1.6、清空结点

2、LinkedList

2.1、什么是LinkedList

2.2、LinkedList常用方法

2.3、LinkedList的遍历

[3、ArrayList 和LinkedList区别](#3、ArrayList 和LinkedList区别)


双向链表结构:

1、实现自己的双向链表 (不带头)

与单链表一样,先实现IList接口,再重写其中的所有方法

创建一个静态内部类ListNode,表示结点,结点中包含数据域、prev域和next域

1.1、display、size、contains方法

display、size、contains方法

1.2、头插法尾插法

头插法

尾插法

引入 last 用于指向链表的尾,优点是在使用尾插法插入一个结点的时候,时间复杂度是O(1),因为它省略了找最后一个结点的过程

在插入结点时,统一先绑定后面的节点,减少出错的可能

1.3、任意位置插入一个节点

任意位置插入一个节点

1.4、删除第一个值为key的节点

删除一个结点

1.5、删除所有值为key的节点

1.6、清空结点

粗暴的写法,也能回收所有结点

更好的写法

2、LinkedList

2.1、什么是LinkedList

LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的结点中,通过引用将节点连接起来,所以在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。

  • LinkedList实现了List接口
  • LinkedList的底层使用了双向链表
  • LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
  • LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)
  • LinkedList比较适合任意位置插入的场景

构造方法:

2.2、LinkedList常用方法

2.3、LinkedList的遍历

IList myLinkedList = new MyLinkedList();
LinkedList<Integer> list = new LinkedList<>();
list.add(1); // 尾插
list.add(2);
list.add(3);
list.add(4);


// 直接使用toString
System.out.println(list);


// foreach遍历
for(Integer x: list) {
System.out.print(x+" ");
}
System.out.println();


// for 循环
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();


// 使用迭代器遍历---正向遍历
ListIterator<Integer> it = list.listIterator();
while (it.hasNext()) {
System.out.print(it.next()+" ");
}
System.out.println();


// 使用迭代器遍历---反向遍历
ListIterator<Integer> it2 = list.listIterator(list.size());
while (it2.hasPrevious()) {
System.out.print(it2.previous()+" ");
}
System.out.println();

3、ArrayList 和LinkedList区别

面试问题:

1.ArrayList 和LinkedList区别是什么?

2.顺序表和链表的区别?

3.数组和链表的区别?

元素高效存储:比如说每次都往最后一个位置插入,很快就能完成

应用场景补充:

如果是经常根据下标进行查找的使用顺序表 (ArrayList)

如果经常进行插入和删除操作的可以使用链表 (LinkedList)

相关推荐
CV_J5 分钟前
安装kibana
java·elasticsearch·spring cloud·docker·容器
码农水水2 小时前
国家电网Java面试被问:TCP的BBR拥塞控制算法原理
java·开发语言·网络·分布式·面试·wpf
qq_336313932 小时前
java基础-网络编程-TCP
java·网络·tcp/ip
咕噜咕噜啦啦3 小时前
Java期末习题速通
java·开发语言
盐真卿3 小时前
python2
java·前端·javascript
一嘴一个橘子4 小时前
mybatis - 动态语句、批量注册mapper、分页插件
java
组合缺一4 小时前
Json Dom 怎么玩转?
java·json·dom·snack4
-To be number.wan4 小时前
B 树 vs B+ 树:为什么 MySQL 用 B+ 树,而不是 B 树?
数据结构
危险、4 小时前
一套提升 Spring Boot 项目的高并发、高可用能力的 Cursor 专用提示词
java·spring boot·提示词
kaico20184 小时前
JDK11新特性
java