一、定义
在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续。
1.可以分三类为
-
单向链表,每个元素只知道其下一个元素是谁
-
双向链表,每个元素知道其上一个元素和下一个元素
-
循环链表,通常的链表尾节点tail指向的都是null,而循环链表的tail指向的是头节点head
链表内还有一种特殊的节点称为哨兵节点,也叫做哑元(Dummy)节点,它不存储数据,通常用作头尾,用来简化边界判断,如下图所示:
2.性能
随机访问
根据index查找,时间复杂度O(n)
插入或删除
起始位置:O(1)
结束位置:如果已知tail尾节点是O(1),不知道tail尾节点是O(n)
中间位置:根据index查找时间 + O(1)
二、单向链表的插入、删除、查找示例
1.以下为不带哨兵节点代码
package com.tfq.arithmetic.linkedlist;
import java.util.Iterator;
import java.util.function.Consumer;
/**
* @author: fqtang
* @date: 2024/05/18/19:23
* @description: 单向链表类
*/
public class SingleLinkedList implements Iterable<Integer> {
/**
* 头指针
*/
private Node head = null;
public void addFirst(int value) {
//1.链表为空
// head = new Node(value,null);
//2.链表非空
head = new Node(value, head);
}
/**
* 返回链表第一种方式
*
* @retur