1、概述
链表就是通过指针将一个个节点连接起来。链表是非连续的动态内存空间,链表的查找比数组慢,但是添加和删除比数组快。在链表中分为他的种类分为单链表、双向链表、循环链表三种。
2、单链表
它是由一组节点组合而成的集合, 每个节点都使用一个对象的引用指向它的后继。 指向另一个节点的引用叫做链。那么我们通过下面的图来做详细分析,
根据上面链表结构发现:
每个结点除了存储数据data外,还需要记录下个结点的地址,称为后继指针next。
单链表有两个特殊的结点,分别是第一个结点——头结点和最后一个结点——尾结点。
头结点:用来记录链表的基地址。
尾结点:尾结点的后继指针指向一个空地址NULL。
3、双向链表
双向链表和单向链表的区别就是每一个元素是双向的,一个元素中包含两个引用:一个指向前一个元素;一个指向下一个元素。除此之外,双向链表还有一个指向最后一个元素的tail指针,这使得双向链表可以从头尾两个方向迭代链表,他的结构如下所示:
每个结点除了存储数据data外,还会会记录上一个结点和下一个结点的地址。
单链表和双向链表的区别
单链表的结点只有一个指向,即后继指针next指向下一个结点。
双向链表的结点有两个指向,一个后继指针next指向下一个结点,还有一个前驱指针prev指向上一个结点。
4、循环链表
循环链表的尾结点不指向空,而是指向头结点,类似一个环形结构。如下结果图所示:
5、链表的特性
(1)链表的内存空间都是零散的,所以它不支持随机访问
(2)插入或删除数据不需要移动数据,在这方面的效力还是比较高的
(3)因为链表的每个内存块都不是连续的,所以不需要提前计算内存的大小,内存空间可以根据结点数量的改变而改变。
6、顺序表与链表的对比
顺序表和链表都属于线性表,那么他们之间还是存在一定差异性,如下分析:
以上就是对链表的一个基本了解,下面对链表常用的一些操作举列
链表声明:
public class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
this.next = null;
}
}
链表的添加:
public void insertList(ListNode head, int val) {
ListNode tempNode = new ListNode(val);
if (head == null) {
head = tempNode;
}else {
ListNode p = head;
while (p.next != null) {
p = p.next;
}
p.next = tempNode;
}
}
链表的删除:
public void deleteListNode(ListNode head, int val) {
if (head ==null) return;//为了鲁棒性
if (head.val == val) {//头节点为要删除节点
head = head.next;
} else {
ListNode p = head;
//删除节点需要知道前一个节点,所以判断p.next.val是不是和目标相等
while (p.next !=null && p.next.val != val) {
p = p.next;
}
if (p.next !=null) {
p.next = p.next.next;//删除节点
}
}
}