用Java定義一個循環連結清單,實作連結清單的基本操作: 初始化、擷取頭結點、添加新元素、删除連結清單元素、擷取連結清單元素、查找連結清單元素、更新連結清單中某個元素、 判斷連結清單是否為空、求連結清單元素個數、輸對外連結表元素、清空連結清單。
邏輯思維圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL3lFRPJzaU5EeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyAjM1UDN0MjMyIzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
先上結果圖
操作結果為上圖
//初始化
CircularLinkedList<Integer> clList = new CircularLinkedList<Integer>();
//插入資料
clList.insertList(1);
clList.insertList(2);
clList.insertList(3);
clList.insertList(4);
clList.insertList(5);
clList.insertList(6);
clList.print();
//列印連結清單長度
System.out.println("連結清單長度:" + clList.size());
//修改第6個元素為888
System.out.println("修改第6個元素為888," + clList.modify(888, 6));
clList.print();
//删除元素1的節點
System.out.print("删除元素1的節點");
clList.deletelist(1);
clList.print();
//查詢指定位置元素
System.out.println("第1個元素值為:" + clList.getElement(1).data);
System.out.println("第2個元素值為:" + clList.getElement(2).data);
System.out.println("第3個元素值為:" + clList.getElement(3).data);
//删除元素2的節點
System.out.print("删除元素2的節點");
clList.deletelist(2);
clList.print();
//判斷元素是否存在
System.out.println("元素2是否存在?"+clList.isContain(2));
System.out.println("元素3是否存在?"+clList.isContain(3));
//清空連結清單
System.out.println("清空連結清單");
clList.clear();
clList.print();
添加新元素
public void insertList(T obj) {
Node<T> e = new Node<T>();
e.data = obj;
if (head.next == head)// 第一次插入元素
{
head.next = e;
e.next = head;
} else// 不是第一次插入元素
{
// temp引用在棧中,temp和head引用都指向堆中的initList()中new的Element對象
Node<T> temp = head;
while (temp.next != head)// 尋找最後一個元素
{
temp = temp.next;
}
temp.next = e;
e.next = head;// 新插入的最後一個節點指向頭結點
}
}
删除連結清單中指定元素
public boolean deletelist(T obj) {
Node<T> temp = head;
if(!isContain(obj)){
System.out.println("元素"+obj+"不存在");
return false;
}
while (temp.next != head) {
// 判斷temp目前指向的結點的下一個結點是否是要删除的結點
if (temp.next.data.equals(obj)) {
temp.next = temp.next.next;// 删除結點
} else {
temp = temp.next;// temp“指針”後移
}
}
return true;
}
擷取連結清單的第i個位置的元素
public Node<T> getElement(int i) {
if (i <= 0 || i > size()) {
System.out.println("擷取連結清單的位置有誤!傳回null");
return null;
} else {
int count = 0;
Node<T> element = new Node<T>();
Node<T> temp = head;
while (temp.next != head) {
count++;
if (count == i) {
element.data = temp.next.data;
}
temp = temp.next;
}
return element;
}
}
查找連結清單元素
public boolean isContain(T obj) {
Node<T> temp = head;
while (temp.next != head) {
if (temp.next.data.equals(obj)) {
return true;
}
temp = temp.next;
}
return false;
}
更新連結清單中指定位置的元素
public boolean modify(T obj, int pos) {
if (isEmpty()) {
System.out.println("連結清單為空");
return false;
} else {
if (pos < 1 || pos > size()) {
System.out.println("pos值不合法");
return false;
}
int num = 1;
Node<T> q = head.next;
while (num < pos) {
q = q.next;
num++;
}
q.data = obj;
return true;
}
}
判斷連結清單是否為空
public boolean isEmpty() {
return size() == 0;
}
求連結清單元素個數
public int size() {
Node<T> temp = head;
int size = 0;
while (temp.next != head) {
size++;
temp = temp.next;
}
return size;
}
輸對外連結表元素
public void print() {
System.out.print("列印連結清單:");
Node<T> temp = head;
while (temp.next != head) {
temp = temp.next;
System.out.print(temp.data + " -> ");
}
System.out.println();
}
清空連結清單
public void clear() {
head.data = null;
head.next = head;
}