Java LinkedList
链表(LinkedList)是一种常见的基础数据结构,是一种线性表,但是并不是会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。
链表可以分为单向链表和双向链表:
- 一个单向链表包含两个值,当前节点的值和一个指向下一个节点的链接
- 一个双向链表有三个整数值:数值、向后的节点链接、向前的节点链接
与 ArrayList 相似,是一种常用的数据容器。相比:LinkedList 的增加和删除对操作效率更高,而查找和删除的操作效率较低。
使用情况:ArrayList:
- 频繁访问列表中的某一个元素
- 只需要在列表末尾进行添加和删除元素操作
使用情况:LinkedList:
- 需要通过循环迭代来访问列表中的某些元素
- 需要频繁的在列表开头、中间、末尾等位置进行添加或删除元素操作
LinkeList 继承了 AbstractSequentiaList 类
实现了 Queue 接口,可以作为队列使用;实现了 List 接口,可以进行列表的相关操作;实现了 Deque 接口,可以作为队列使用;实现了 Cloneable 接口,可以实现克隆;实现了 java.io.Serializable 接口,支持序列化,能够通过序列化传输;
在 java.util.LinkedList 包中
- LinkedList list = new LinkedList(); //创建方法
- LinkedList list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表
1. 创建一个简单链表实例
public class Test {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<String>();
System.out.println(list);
}
}
运行结果:
[]
2. 添加元素 addFirst(),addLast()
public class Test {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<String>();
list.add("two"); //添加一个元素
list.addFirst("one"); //在头部添加元素
list.addLast("three"); //在尾部添加元素
System.out.println(list);
}
}
运行结果:
[one, two, three]
3. 移除元素 removeFirst(),removeLast()
public class Test {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<String>();
list.add("two");
list.addFirst("one");
list.addLast("three");
list.remove(1); //移除一个元素
list.removeFirst(); //移除头部元素
list.removeLast(); //移除尾部元素
System.out.println(list);
}
}
运行结果:
[]
4. 获取元素 getFirst(),getLast()
public class Test {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<String>();
list.add("two");
list.addFirst("one");
list.addLast("three");
//根据下标得到值输出
System.out.println(list.get(1));
//得到头部元素
System.out.println(list.getFirst());
//得到尾部元素
System.out.println(list.getLast());
}
}
运行结果:
two
one
three
5. 迭代元素
- 使用 for 和 size()
public class Test {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<String>();
list.add("two");
list.addFirst("one");
list.addLast("three");
//通过 size() 方法计算链表大小
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
运行结果:
one
two
three
- 通过 fro-each
public class Test {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<String>();
list.add("two");
list.addFirst("one");
list.addLast("three");
for (String s : list) {
System.out.println(s);
}
}
}
运行结果:
one
two
three