链表(LinkedList)简介
- 链表是以节点的方式来存储数据,是链式存储,如图1图2。
- 每个节点包含 数据域(data); 指针域(next):指向下一个节点的地址。
- 如图2,链表在内存的空间并不是连续的,每个节点通过指针域来指向下一个节点,而数组在内存中一个连续的区域。因为链表的这个特点,只要还有内存可以分配,那么链表就可以无限延长,而数组必须一开始指定长度且不能动态的修改长度。
- 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定,图2是带头结点的链表。
- 常见操作
- 删除节点原理示意图
- 链表尾部插入节点原理示意图
- 链表中间插入节点原理示意图
下面以一个demo来完成单链表的增删改查
1.因为链表由一个一个的节点组成,因此需要定义一个节点类(Node)。假设属性包括id、name(这些是节点的数据域),和next(指针域)。
Node类如下
/**
* 定义Node类,一个Node对象就是一个节点
*/
class Node {
private int id; // id,唯一
private String name; // 姓名
private Node next; // 指针域,指向下一个节点
// 省略setter、getter、构造器等
}
2.定义一个SingleLinkedList单链表类,SingleLinkedList类包括一个成员变量head,是链表的头结点
SingleLinkedList类如下
// 定义StarSingleLinkedList,单向链表
class SingleLinkedList {
// 初始化一个头结点,头结点不存放数据
private Node head = new Node(0, null);
// 添加节点
public void append(Node node) {
// 因为node的id是唯一的,添加时应该先判断新节点的id存在与否,存在了就不能添加,这里就不做处理了
// 步骤:1.找到该链表的最后一个节点 2.将最后这个节点的指针域指向新节点
Node temp = head;
// 遍历链表,知道找到最后那个节点,当temp.next==null时,就找到了最后那个节点
while (temp.getNext() != null) {
// temp后移
temp = temp.getNext();
}
// 将最后节点的next域指向新节点
temp.setNext(node);
}
// 遍历链表
public void list() {
// 判空