什么是链表?
链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
1.简介
单链表中的每个结点不仅包含值,还包含链接到下一个结点的引用字段。通过这种方式,单链表将所有结点按顺序组织起来。
- 底层实现代码展示:
package com.Gray.LinkedList;
public class LinkedListImpl<E> {
private class Node {
//本结点存储了自己的元素,和下一个元素的结点
public E e;
public Node next;
public Node(E e, Node next) {
this.e = e;
this.next = next;
}
public Node(E e) {
this(e, null);
}
public Node(Node next) {
this(null, null);
}
@Override
public String toString() {
return e.toString();
}
}
private Node head;//头结点
private int size;//记录链表中的元素
public LinkedListImpl() {
head = null;
size = 0;
}
//获去链表中元素的个数
public int getSize() {
return size;
}
//返回链表是否为空
public boolean isEmpty() {
return size == 0;
}
//向表头添加元素
public void addFirst(E e) {
/* Node node = new Node(e);
node.next = head;
head = node;
*/
head = new Node(e, head);
size++;
}
//在链表的index(0-base)位置添加新的元素e
//在链表中不是一个常规的操作,练习可能会用到
public void add(int index, E e) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("Add failed.Illegal index.");
}
if (index == 0) {
addFirst(e);
} else {
Node prev = head;
for (int i = 0; i < index - 1; i++) {
prev = prev.next;
}
Node node = new Node(e);
node.next = prev.next;
prev.next = node;
size++;
}
}
//在链表的末尾添加新的元素e
public void addList(E e) {
add(size, e);
}
}
- 内存图
- 向链表头添加元素
- 向链表中添加元素
执行顺序别弄反,先用当前结点指向后一个元素,再用前一个元素结点指向当前元素…
- 删除链表中的元素
2.数组和链表的对比
-
链表:
优点: 它是真正的动态数据结构,不需要处理固定容量的问题.增删快
缺点:丧失了随机访问的能力,查询慢(就物理存储来说,链表在内存中开辟的是一片不连续的物理空间
),通过结点
一点一点的去查询… -
数组:
优点:查询快(就物理存储来说:数组在内存中开辟的是一片连续的物理空间
)
缺点:增删慢
3.常用方法:
- 构造方法:
Constructor | 描述 |
---|---|
LinkedList() | 构造一个空列表。 |
LinkedList(Collection<? extends E> c) | 构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。 |
- 代码实现:
package com.Gray.LinkedList;
import java.util.LinkedList;
import java.util.List;
public class DemoLink {
public static void main(String[] args) {
//创建链表集合
List<String> list = new LinkedList<>();
}
}
- 常用方法
方法名 | 说明 |
---|---|
public boolean add(E e) | 将指定的元素追加到此集合的末尾 |
public int size() | 返回集合中的元素的个数 |
public E get(int index) | 返回指定索引处的元素 |
public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
public boolean remove(Object o) | 删除指定的元素,返回删除是否成功 |
- 代码示例:
package com.Gray.LinkedList.PracticeLinkedList;
import java.util.LinkedList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new LinkedList<>();
//添加元素
list.add("大桥未久");
list.add("新垣结衣");
list.add("三上悠亚");
list.add("明里紬");
//遍历
System.out.println("----------遍历----------");
for (String s : list) {
System.out.println(s);
}
//删除元素
System.out.println("-------删除了[大桥未久]-----");
list.remove("大桥未久");
System.out.println(list);
//链表大小
System.out.println("---------链表大小---------");
System.out.println(list.size());
}
}
- 运行截图: