链表的种类有很多,这里只挑选其中的部分种类来实现
目录
1.链表概念
链表同样是线性表的一种,其特点是物理存储结构不连续,逻辑顺序是通过链表中的引用链接次序来实现(具体可以想象下火车车厢是如何连接的)
具体结构如下图:
节点分为两个部分,一部分用来存放数据,另一部分存放下一节点的地址,第一个节点称为头结点
2.链表分类
链表的种类有很多,主要有3个特点
- 单向/双向
上图所示就是单向,双向的话节点就需要分成3部分,多出来的部分用来存放上一个节点的地址
- 循环/不循环
不循环就是最后一个节点指向null,循环则是指向头结点
- 带头/不带头
带头就是头结点不存放数据,只存放下一个节点的地址,不带头就是头结点也存放数据
带头的链表头节点是不变的
上述的特点进行排列组合的话就有8种链表结构,但是我们的重点只有两种
- 无头单向非循环链表:此链表结构最简单,在实际使用的时候多用于其它数据结构的子结构,并且在oj题中出现的最多的也是这种链表
- 无头双向非循环链表:Java官方提供的链表就是此链表
本文实现的就是不带头单向不循环链表
3.链表的实现
首先链表是由节点组成,所以在链表类中定义一个节点的内部类
public class LinkList {
static class ListNode {
public int data;
public ListNode next;
public ListNode(int i) {
this.data = i;
}
}
}
由于链表的结构,链表的增删改查等操作都需要头节点,所以在类里面再定义一个头节点,而且我想在实例化的时候可以直接在后面写数据,所以再加一个构造方法
public class LinkList {
static class ListNode {
public int data;
public ListNode next;
public ListNode(int i) {
this.data = i;
}
}
public ListNode head;
public LinkList(int val) {
ListNode listNode = new ListNode(val);
this.head = listNode;
}
}
接下来就是链表的操作,这里只讲增和删,这两个掌握,查和改也就不需要过多讲了
3.1增加数据
3.1.1头部添加数据
既然是头部添加数据,那么这个添加进来的节点就是新的头节点