- 创建一个结点内部类
class Entry{
//节点类
int data;//内部类成员变量
Entry next;
public Entry(){//循环单链表初始化
this.data=-1;
next=null;
}
public Entry(int data){
this.data=data;
next=null;
}
}
- 循环单链表头插法
private Entry head=null;//创建一个头结点,赋值为空
public TestClink(){//头结点的初始化
this.head=new Entry();//new 一个head头结点
this.head.next=this.head;//让这个循环链表的next域指向自己
}
public void insertHead(int val){
Entry entry=new Entry(val);
entry.next=this.head.next;//前边指向的结点地址给插入的 next
this.head.next=entry;//后边指回来
}
输入:
TestClink t1=new TestClink();
for(int i=0;i<9;i++){
t1.insertHead(i);
}
t1.show2();
输出:
视图分析:
3. 循环单链表尾插法
public void insertTail(int val){//
Entry entry = new Entry(val);
Entry cur = this.head;
while(cur.next != this.head){
cur = cur.next;
}
cur.next = entry;
entry.next = this.head;
}
输入:
TestClink t1=new TestClink();
for(int i=0;i<9;i++){
t1.insertTail(i);
}
t1.show2();//链表输出方法
输出结果:
视图分析:
- 删除循环单链表的所有值为val的结点
public void deleteEntry(int val){
Entry prev=this.head;//前驱
Entry cur=this.head.next;
while(cur!=this.head){
if(cur.data==val){
prev.next=cur.next;
cur=prev.next;
}else{
prev=cur;
cur=cur.next;
}
}
}
输入:
TestClink t1=new TestClink();
for(int i=0;i<9;i++){
t1.insertHead(i);
}
t1.show2();
t1.deleteEntry(6);
t1.show2();
输出:
视图分析:
- 求循环单链表的长度
public void getLength(){//求循环链表的长度
Entry cur=this.head;
int len=0;
while(cur.next!=this.head){
len++;
cur=cur.next;
}
System.out.println(len);
}
输入:
TestClink t1=new TestClink();
for(int i=0;i<9;i++){
t1.insertHead(i);
}
t1.show2();
t1.getLength();
输出: