赞
踩
前言:
上一篇文章我们初步介绍了 List 以及 ArrayList,我们不难发现使用 ArrayList 过程中,对元素进行操作可能会涉及到大量数据的改变,所以LinkedList “临危受命”,本篇文章将从链表的相关概念入手,对单向、双线链表进行模拟实现,再回到 LinkedList 集合内当中进行简单分析,最后结合上一篇文章,阐述四点 LinkedList 和 ArrayLIst 区别。如果有需要快速了解两者区别的朋友可以直接跳转 ArrayList 和 LinkedList的区别
- 希望能对各位看官朋友有所裨益,如有问题欢迎批评指正
重点:
(1)是什么
(2)分类
通过下面的三种特征可以自由组合成 8 种链表结构
带头 / 不带头
带头双向链表常出现与对于 链表结构有修改操作 的题目中,可以省去很多特殊情况的判断
常见是创建一个虚拟头结点(哨兵节点)dummy,头插至链表中
删除有序链表中重复的元素-II 有兴趣可以尝试一下删除链表元素经典题目
这里我们指的是 单向不带头非循环 链表,也是面试笔试的高频问题之一
实际情况中,单链表一般是作为其他数据结构(哈希桶、图…)的子结构
有兴趣可以尝试一下 牛客网面试必刷 TOP101 的链表题目,都很具有代表性,博主后续也会跟进个人关于单链表的刷题记录,可以点个关注不迷路哦
不带头单向非循环链表
Node 类
成员变量
构造方法
Node head
头插
尾插
在 index 位置插入元素
查找元素
删除第一个出现指定元素
删除所有出现的指定元素
链表长度
打印链表所有元素
清空链表
我们先对双线链表中的常用操作进行模拟实现,有利于我们后续对源码的阅读分析
Node 类
Node head
Node tail
头插法
打印单链表
尾插法
查找关键字 key
单链表长度
任意位置插入
删除关键字为key 的节点
删除链表
ListIterator 遍历
顺序遍历
逆序遍历
传入 E e, 返回值为 boolean
调用尾插方法 void linkLast(e)
指定位置插入元素时间复杂度为 O(N),使用 node(index) 查找 index 位置元素最坏要查找 N / 2 次,时间复杂度为 O(N)
调用 checkPositionIndex(index) 方法判断 index 的 合法性
判断是否 size == index,直接进行 linkLast 尾插,否则调用 linkBefore(element, node(index)) 方法进行插入
linkLast 尾插 add(E e) 中已有所述
linkBefore 参数为( E e, Node succ )
node 方法中,先确定 index 是在前半部分还是后半部分,从头或者从尾遍历查找 index 位置的元素进行返回,加快查找速度
方法名 | 具体功用 |
---|---|
boolean addAll (Collection <? extends E> c) | 尾插 集合 c 中的元素 |
E remove (int index) | 删除 下标为 index 位置的元素 |
boolean remove (Object o) | 删除 第一个出现的元素 o |
void clear () | 清空 所有元素 |
boolean contains (Object o) | 查询 是否包含元素 o |
E get (int index) | 查询 index 位置的元素 |
int indexOf (Object o) | 查询 第一个出现的元素 o 的下标 |
int lastIndexOf (Object o) | 查询 最后一个出现的元素 o 的下标 |
E set (int index, E element) | 设置 index 位置元素为 o |
List subList (int fromIndex, int toIndex) | 截取 从 from 到 to 的元素(左闭右开) |
和 ArrayList 常用方法类似,所以如果刷题过程中有构造 List 的需求,可以使用 ArrayList 也可也使用 LinkedList
紧承上一篇关于 顺序表 的内容,这篇文章从单链表讲起,同时剖析了 LinkedList 集合类。在回顾过程中,我们最后来总结一下 链表 和 顺序表的区别到底几何
注意我们这里说指的是具体的集合类,不是指顺序表和链表
(1)空间存储
(2)随机访问
(3)插入操作
(4)应用场景
文章至此就结束啦,如果看官朋友觉得还不错,博主求 点赞、评论、收藏 三连,十分感谢
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。