本文介绍:
本文主要讲解了循环链表的原理和实现,需要有单链表的基础,没有了解单链表的小伙伴可以看一下我的上一篇文章(单链表)。
循环链表介绍:
循环链表是单链表的衍生,在某个方面更好的完善了单链表,循环链表的特征就是是单链表的最后一个结点和单链表的第一个结点相连接,即最后一个结点指向头结点,行成一个环。
循环链表的原理:
循环链表的代码:
循环链表对比单链表最大的不同就是添加一个结点,这个结点的下一个的指向的不同,单链表的下一个为null,而循环链表需要指向头结点
//下一个结点的地址(下一个指向当前接待你) -- 循环链表的精髓this
LoopNode next = this;
全部代码:
//循环链表
public class LoopNode {
//结点内容 -- 数据
int data;
//下一个结点的地址(下一个指向当前接待你) -- 循环链表的精髓this
LoopNode next = this;
public LoopNode(int data) {
this.data = data;
}
//追加结点
public LoopNode append(LoopNode node) {
//保存当前结点
LoopNode currNode = this;
while(true) {
//如果当前结点的下一个结点是头结点,说明当前结点是最后一个结点
if(currNode.next == this) {
//为当前结点追加结点node,且node下一个指向头结点
currNode.after(node);
return this;
}
//继续循环
currNode = currNode.next;
}
}
//插入一个结点作为当前结点的下一个结点
public void after(LoopNode node) {
//获取当前结点的下个结点
LoopNode newNode = this.next;
//将当前结点的下一个结点修改为要插入的结点node
this.next = node;
//最后将插入的结点node的下一个结点变为newNode
node.next = newNode;
}
//删除下一个结点
public void removeNext() {
//取出下下一个结点
LoopNode newNext = next.next;
//把下下一个结点设置为当前结点的下一个结点
this.next = newNext;
}
//获取下一个结点next
public LoopNode next() {
//需要判断是否next为空
return this.next;
}
//获取结点中的数据
public int getData() {
return this.data;
}
//显示所有结点的信息
public void show() {
LoopNode currNode = this;
do{
System.out.print(currNode.data + " ");
currNode = currNode.next;
}while(currNode != this);
System.out.println();
}
public static void main(String[] args) {
LoopNode n1 = new LoopNode(1);
LoopNode n2 = new LoopNode(2);
LoopNode n3 = new LoopNode(3);
LoopNode n4 = new LoopNode(4);
LoopNode n5 = new LoopNode(5);
n1.append(n2);
n1.append(n3);
n1.append(n4);
System.out.print("追加结点后:");
n1.show();
System.out.print("在结点3后面插入结点5:");
n3.after(n5);
n1.show();
System.out.print("结点4的下一个结点为:");
System.out.println(n4.next().getData());
}
}
运行结果:
追加结点后:1 2 3 4
在结点3后面插入结点5:1 2 3 5 4
结点4的下一个结点为:1
生命不息,编程不止!加油!