既然有线性表的链式存储结构,那么我们可以想到一定也有单向循环链表。
下面让我们来看看单向循环链表。
单向循环链表的本质就是让单链表的尾节点指针指向头结点,这样就可以让整个单链表形成一个环。
这种头尾相连的单链表就叫做单向循环链表。
为了方便操作,我们让头指针不再指向虚拟头结点,而是直接指向真实头结点,也就是链表中的第一个节点。
此时单向循环链表因为存储结构的改变所以不能再用LinkedList 链表来实现了。但是他们都是单向的所以都要有节点的信息,都要私有化一个节点的内部类。
实际上单向循环链表本质上是特殊的线性表,所以我们要实现之前写的list接口。
1.下面我们来定义LoopSingle类
代码如下:
public class LoopSingle<E> implements List<E> {
private Node head; //定义一个头指针
private Node rear; //定义一个尾指针
private int size; //定义循环链表节点个数
public LoopSingle() { //创建单向循环链表的无参构造函数
head=null; //创建时为空,所以头指针和尾指针都指向空,size=0
rear=null;
size=0;
}
public LoopSingle(E[] arr){ //创建单向循环链表的有参构造函数
//传入一个数组,封装成循环链表
}
private class Node{ //私有化节点这个内部类
E data; //数据域
Node next; //指针域
public Node(){ //创建节点的无参构造函数
this(null,null);
}
public Node(E data,Node next){ //创建节点的有参构造函数
this.data=data;
this.next=next;
}
}
一.插入
1.链表为空时
链表为空时head指针和rear指针都指向空,因为表中无带有元素的节点。
反之我们也可以看出判断单向循环链表为空的条件:head指向空,rear指向空,size=0
2.链表为空时插入一个节点
此时链表为空,head=null;rear=null;size=0。
我们要插入包含“A”元素的新节点
1.让head指向“A”元素所在的节点
2.让“A”元素所在节点的后继指针指向“A”元素所在节点(自身的数据域)
3.让rear指向“A”元素所在节点
这样就完成了链表为空时插入一个数据节点的操作,效果如下图。
此时就完成了size为1的一个单向循环链表
二.链表