什么是循环链表:
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个链表形成一个环,这种头尾相接的单链表成为单循环链表,简称循环链表(circular linked list)。
循环链表的各种操作与单链表的相似,只是要注意循环链表的尾结点是指向头结点的
class TestCLink{
Entry head;
public TestCLink(){//头结点的初始化
this.head=new Entry();
this.head.next=this.head;
}
class Entry{//
int data;
Entry next;
public Entry(){
this.data = -1;
next = null;
}
public Entry(int data){
this.data = data;
next = null;
}
}
//头插法,与单链表的头插法相似,
public void inserthead(int val){
Entry entry=new Entry(val);
entry.next=this.head.next;
this.head.next=entry;
}
//尾插法
public void insertrail(int val){
Entry cur=this.head;
Entry entry=new Entry(val);
while(cur.next!=this.head){//先找到尾结点,与单链表大致相同,但是注意循环链表的尾结点是指向头结点的
cur=cur.next;
}
entry.next=cur.next;
cur.next=entry;
}
//删除一个val
public void delete(int val){
Entry fast=this.head.next;
Entry slow=this.head;
while(fast.data!=val&&fast.next!=this.head){
fast=fast.next;
slow=slow.next;
}
slow.next=fast.next;
}
//删除全部的val
public void deleteAll(int val)
{
Entry t1 = this.head;
Entry t2 = this.head.next;
while(t2 != this.head)
{
if(t2.data == val)
{
t1.next = t2.next;
t2 = t1.next;
}
else
{
t1 = t1.next;
t2 = t2.next;
}
}
}
//得到链表的长度
public void getlength(){
Entry cur=this.head;//获取头结点
int i=0;
while(cur.next!=this.head){
i++;
cur=cur.next;
}
System.out.println("单链表长度为"+i);
}
//判断链表是否为空
public boolean isempty(){
Entry cur=this.head;
if(cur.next==this.head){
return true;
}
return false;
}
//打印循环链表
public void show(){
Entry cur=this.head.next;
while(cur!=this.head){
System.out.println("cur.data= "+cur.data+" ");
cur=cur.next;
}
}
}
public class test1 {
public static void main(String[] args) {
TestCLink t1=new TestCLink();
for(int i=0;i<5;i++){
t1.insertrail(i);
}
t1.insertrail(5);
t1.insertrail(5);
t1.show();
System.out.println("====删除第一个5=====");
t1.delete(5);
t1.show();
t1.getlength();
System.out.println("====删除全部5=====");
t1.deleteAll(5);
t1.show();
// TODO Auto-generated method stub
}
}
运行结果:
cur.data= 0
cur.data= 1
cur.data= 2
cur.data= 3
cur.data= 4
cur.data= 5
cur.data= 5
====删除第一个5=====
cur.data= 0
cur.data= 1
cur.data= 2
cur.data= 3
cur.data= 4
cur.data= 5
单链表长度为6
====删除全部5=====
cur.data= 0
cur.data= 1
cur.data= 2
cur.data= 3
cur.data= 4