什么是链表?
链表是一种数据结构,比如最简单的,单向链表
如图,单向链表中有很多节点,然后每个节点分2部分,一部分保存节点信息,另一部分保存下一个节点的信息. 可想而知,这种结构,插入数据会很快.但是,查找数据会比较慢.这个慢是与数组相比而言的,数组查找用的是索引,链表查找需要遍历.遍历当然会慢!
用编程语言,大概就是
public class LinkedList<Item> {
private Node first;
private class Node {
Item data;
Node next;
}
...
}
另一种,双向链表
`
链表有什么用?
从定义可以看出来,就是插入速度很快. 如果需要经常插入数据,就可以选择链表结构.
java中如何应用链表?
java中LinkedList在添加数据时就用的链表结构,
以添加 list.add(3);
为例看一下执行过程
public class Test {
public static void main(String[] args) {
LinkedList<Integer> list=new LinkedList<>();
list.add(3);
list.add(4);
}
}
利用idea步入一步一步分析变量变化过程
看一下过程.调用linkLast方法
linkLast中参数e为3
截至目前newNode的前一个和后一个节点都是null
调用Node构造函数,构建新Node
将刚才构造好的newNode赋值给last,因为添加元素默认都是添加到List的最后面.
如果l(就是前一个元素)为null,说明是第一个,那么将newNode设为first.因为是插入第一个元素,这个元素既是第一个,也是最后一个.
如果前一个节点不为空,则执行else部分.
add总结
- add方法的关键是调用了linkLast方法.
- linkLast主要构建了一个新Node,而构建一个新Node,只需要pre,element,next就足够了,这是一个双向链表.
- 插入元素的本质就是更新链表前一个元素的next值.
比如.设原先数组只有一个元素{3} ,那么就是
Node1-> null,3,null
当插入一个新元素4后,则变成
Node1 -> null,3,4
Node2->3,4,null
public boolean add(E e) {
linkLast(e);
return true;
}
/**
* Links e as last element.
*/
void linkLast(E e) {
final Node<E> l = last;
//创建新Node,e为待插入的元素
final Node<E> newNode = new Node<>(l, e, null);
//将新Node赋值为last
last = newNode;
//如果前一个元素为null,说明新元素是第一个元素,所以将newNode赋值为first
if (l == null)
first = newNode;
//如果前一个元素不为null,就更新l的next为newNode.原先l的next为null,现在更新为newNode.
else
l.next = newNode;
//list的长度+1
size++;
modCount++;
}
总结
链表就是一种方便插入,但是查找较慢的数据结构.使用时其实感觉不到其存在.