Java中链表的用法
1.链表的概念
- 链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放 数据元素。
- 链表中每一个元素成为 “结点” , 每一个结点都是由数据域和指针域组成的, 每个结点中的指针域指向下一 个结点。
- Head 是 “头指针” , 表示链表的开始, 用来指向第一个结点, 而最后一个指针的指针域为 NULL( 空地址 ) ,表示链表的结束。
- 可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的 地址。 实际上,链表中的每个结点可以用若干个数据和若干个指针。
单链表:结点中只有一个指针的链表称为单链表,这是最简单的链表结构。
其节点由两部分构成:
- data域:数据域,用来存储元素数据
- next域:用于指向下一节点
双链表:有前后两个指针的链表。
其节点由三部分构成:
- data域:数据域,用来存储元素数据
- next域:用于指向后一节点
- front域:用于指向前一节点
2.链表的操作
2.1 单链表的操作
2.1.1 插入节点
单链表插入节点主要分两步,顺序不可替换:
1.先将x->next指向A2
2.再将A1->next指向x
2.1.2 删除节点
删除节点其实只需要一步
A1->next 指向A3就行,此时A2会被自动回收
2.1.3 单链表的缺点
通过对单链表的分析,可以看出单链表有如下缺点:
- 单链表的查找方法只能是一个方向
- 单链表不能自我删除,需要靠上一节点进行辅助操作。
2.2 双链表的操作
2.2.1 插入节点
双链表的操作会比单链表复杂很多,顺序也可以是2143,其他的可以自己想一想,只要不断就行。
- x->next指向A2
- A1->next指向x
- x->prev指向A1
- A2->prev指向x
2.2.2 删除节点
删除节点容易很多,先后顺序也不是很重要
A3->prev指向A1
A1->next指向A3
3.Java中链表的使用
以下内容参考Java LinkedList。更详细可以去这里看。
现在来讲Java要用到链表应该怎么写。
ArrayList和LinkedList都实现了链表,两者的区别在于与 ArrayList 相比,LinkedList 的增加和删除的操作效率更高,而查找和修改的操作效率较低。
链表用LinkedList较多。
3.1 Java中链表的操作
LinkedList 类位于 java.util 包中,使用前需要引入它,语法格式如下:
// 引入 LinkedList 类
import java.util.LinkedList;
LinkedList<E> list = new LinkedList<E>(); // 普通创建方法
或者
LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表
创建一个简单的链表实例:
import java.util.LinkedList;
public class RunoobTest {
public static void main(String[] args) {
LinkedList<String> sites = new LinkedList<String>();
sites.add("Google");
sites.add("Runoob");
sites.add("Taobao");
sites.add("Weibo");
System.out.println(sites);
}
}
以上实例,执行输出结果为:
[Google, Runoob, Taobao, Weibo]
其他操作可参考这个表格
方法 | 描述 |
---|---|
addFirst() | 在表头增加一个元素 |
addLast() | 在表尾增加一个元素 |
removeFirst() | 从表头移除一个元素 |
removeLast() | 从表尾移除一个元素 |
getFirst() | 获得表头的元素 |
getLast() | 获得表尾的元素 |
3.2 Java实现链表
想看Java中链表是如何实现以及基本的操作可以看这个博客,讲的很清楚,我就不在这里贴代码了。java ListNode 链表