引言
本文将简单介绍单循环链表的概念、常规操作及其在Java语言中的实现。通过阅读本文,你将了解单循环链表的存储结构、基本操作以及如何使用Java实现一个单循环链表。
概念
单循环链表是一种线性数据结构,它的每个节点都只有一个指向下一个节点的指针。与单向链表不同的是,单循环链表的最后一个节点的指针指向头节点,形成一个环。
存储结构
在Java中,我们可以使用一个类来表示单循环链表的节点。以下是一个简单的节点类:
public class ListNode {
int val; //节点元素
ListNode next; //指向下一个节点
public ListNode(int val){
this.val=val;
}
public void setNext(ListNode a){
next=a;
}
}
创建链表
创建一个链表可以有两种方式。头插法和尾插法。简单来说,头插法就是每一个新增节点都作为新的头节点,而尾插法即相反。下面将通过代码展示 :
//定义一个单循环链表
public class MyLinkedlist {
ListNode head;
ListNode tail;
int size;
public MyLinkedlist(){
head=tail=null;
size=0;
}
//向头部添加节点
public void addHead(ListNode newnode){
if(size==0){ //如果链表为空 新增节点既是头节点也是尾节点
newnode.setNext(newnode);
head=tail=newnode;
size++;
}else{
tail.setNext(newnode); //使尾节点指向新的头节点
newnode.setNext(head); //新节点指向旧的头节点
head=newnode; //新增节点作为新的头节点
size++;
}
}
//向尾部添加节点
public void addTail(ListNode a){
if(size==0){
a.setNext(a);
head=tail=a;
size++;
}else{
tail.setNext(a); //尾节点指向新节点
a.setNext(head); //新节点指向头节点
tail=a; //新节点作为新的尾节点
size++;
}
}
移除节点
移除一个节点的核心就是将要移除节点的前一个节点和后一个节点链接起来。在单循环链表中要特别注意头节点和尾节点的移除。接下来请看代码(自认为代码注释还是比较详细的,😄):
//移除节点
public void remove(int key){
ListNode temp=head;
ListNode temper=tail;
ListNode pre=null; //记录目标节点的前节点
if(size==0){
System.out.println("链表已为空");
return; //直接退出
}
//移除节点是头节点
if(temp.val==key){
head=temp.next; //将头节点的下一个节点作为新的头节点
tail.setNext(head); //尾节点指向新的头节点
size--;
return;
}
//循环寻找要移除的节点
while (temp.val!=key){
pre=temp; //记录目标节点的前节点
temp=temp.next;
if(temp==tail&&temp.val!=key){
System.out.println("没有该节点");
return;
}
}
if(temp==tail){ //移除节点是尾节点
tail=pre; //原尾节点的前一个节点作为新的尾节点
tail.setNext(head); //新的尾节点指向头节点
size--;
}else{
pre.next=temp.next; //直接将目标节点的前节点指向后节点
size--;
}
}
打印链表
打印链表就直接打印好了。从头到尾。
//打印循环链表各个节点
public void print(){
ListNode temp=head;
if(size==0){
System.out.println("链表已为空");
return;
}
while (temp!=tail){
System.out.print(temp.val+" ");
temp=temp.next;
if(temp==tail){ //当到了尾节点就该结束了
System.out.println(tail.val);
break;
}
}
}
尾言
认真仔细阅读代码的话,相信你应该可以对单循环链表的相关操作有一个比较清晰的认识。毕竟本人也没什么水平,好处就是写的代码应该都能看懂,就是按照最直接的逻辑写的。请多多指教!拜拜!