前面已經介紹了java實現單鏈表:http://www.cnblogs.com/lixiaolun/p/4643886.html
其實兩者的主要差別就在於如何判斷是否到了鏈表的結尾:
在單鏈表中
while(temp.next!=null)
{
temp=temp.next;
}
在循環鏈表中
while(temp.next!=header)
{
temp=temp.next;
}
下面是循環鏈表的代碼和測試代碼:
循環鏈表的代碼:
package circularlinkedlist;
public class CircularLinkedList {
class Element
{
public Object value=null;
private Element next=null;
}
private Element header = null;//頭結點
/**
* 初始化鏈表
* */
void initList()
{
header = new Element();
header.value=null;
header.next=header;
}
/**
* 插入鏈表
* */
void insertList(Object o)
{
Element e=new Element();
e.value=o;
if(header.next==header)//第一次插入元素
{
header.next=e;
e.next=header;
}else//不是第一次插入元素
{
//temp引用在棧中,temp和header引用都指向堆中的initList()中new的Element對象
Element temp = header;
while(temp.next!=header)//尋找最后一個元素
{
temp=temp.next;
}
temp.next=e;
e.next=header;//新插入的最后一個節點指向頭結點
}
}
/**
* 刪除鏈表中第i個元素
* */
void deletelist(Object o)
{
Element temp =header;
while(temp.next!=header)
{
//判斷temp當前指向的結點的下一個結點是否是要刪除的結點
if(temp.next.value.equals(o))
{
temp.next=temp.next.next;//刪除結點
}else
{
temp=temp.next;//temp“指針”后移
}
}
}
/**
* 獲取鏈表的第i個位置的元素
* */
Element getElement(int i)
{
if(i<=0 || i>size())
{
System.out.println("獲取鏈表的位置有誤!返回null");
return null;
}
else
{
int count =0;
Element element = new Element();
Element temp = header;
while(temp.next!=header)
{
count++;
if(count==i)
{
element.value=temp.next.value;
}
temp=temp.next;
}
return element;
}
}
/**
* 鏈表長度
* */
int size()
{
Element temp = header;
int size=0;
while(temp.next!=header)
{
size++;
temp=temp.next;
}
return size;
}
/**
* 判斷鏈表中是否存在某元素
* */
Boolean isContain(Object o)
{
Element temp =header;
while(temp.next!=header)
{
if(temp.next.value.equals(o))
{
return true;
}
temp=temp.next;
}
return false;
}
/**
* 打印鏈表
* */
void print()
{
System.out.print("打印鏈表:");
Element temp =header;
while(temp.next!=header)
{
temp=temp.next;
System.out.print(temp.value+"\t");
}
System.out.println();
}
}
測試代碼:
package circularlinkedlist;
public class CircularLinkedListMain {
public static void main(String[] args) {
CircularLinkedList clList = new CircularLinkedList();
clList.initList();
clList.insertList(1);
clList.insertList(2);
clList.insertList(3);
clList.insertList(4);
clList.insertList(5);
clList.print();
System.out.println("鏈表長度:"+clList.size());
clList.deletelist(1);
clList.deletelist(5);
clList.print();
System.out.println("第1個元素值為:"+clList.getElement(1).value);
System.out.println("第2個元素值為:"+clList.getElement(2).value);
System.out.println("第3個元素值為:"+clList.getElement(3).value);
System.out.println(clList.isContain(2));
System.out.println(clList.isContain(6));
// System.out.println(clList.isContain(5));
}
}
