單鏈表實現原理以及具體程式碼(java)
阿新 • • 發佈:2021-01-08
單鏈表
文章目錄
一、什麼是單鏈表?
單鏈表是一種鏈式存取的資料結構,以節點的方式鏈式儲存資料,每個節點包含date域和next域(指向下一個節點),連結串列分為帶頭結點和不帶頭結點。
二、實現原理
單鏈表就是每個節點的next域指向下一個節點。
連結串列是需要自定義實現的,關鍵在於下面兩點:
1.在建立需要單鏈表儲存的物件時,定義一個該物件的屬性next,用於表示下一個節點。(這樣的話,doubleEdgedSword.next就可以表示下一個節點)
2.第二點就是通過連結串列新增資料時,需要定義一個頭結點(DoubleEdgedSword head = new DoubleEdgedSword(0,null,null));
二、使用步驟
程式碼實現(java):
/**
* 單向連結串列
*/
public class SinglyLinkedListDemo {
public static void main(String[] args) {
//測試
DoubleEdgedSword sword2 = new DoubleEdgedSword(2, "鯊齒", "魏莊");
DoubleEdgedSword sword1 = new DoubleEdgedSword(1, "淵虹", "蓋聶");
DoubleEdgedSword sword11 = new DoubleEdgedSword(11, "巨擘", "勝七");
DoubleEdgedSword sword4 = new DoubleEdgedSword(4, "干將莫邪", "傻胖");
SinglyLinkedList singlyLinkedList = new SinglyLinkedList ();
//新增資料入連結串列(考慮順序:這裡自定義的順序是按照no從小到大)
singlyLinkedList.addByOrder(sword2);
singlyLinkedList.addByOrder(sword1);
singlyLinkedList.addByOrder(sword11);
singlyLinkedList.addByOrder(sword4);
//遍歷連結串列
singlyLinkedList.getLinked();
//修改連結串列節點
singlyLinkedList.updateLinkedList(new DoubleEdgedSword(14,"巨闕","陳勝"));
//修改後再次遍歷連結串列
System.out.println("=======================================");
singlyLinkedList.getLinked();
/*//測試刪除連結串列節點
singlyLinkedList.deleteLinkedList(1);
singlyLinkedList.deleteLinkedList(2);
singlyLinkedList.deleteLinkedList(4);
singlyLinkedList.deleteLinkedList(11);
//
System.out.println("===========================");
singlyLinkedList.getLinked();*/
}
}
/**
* 連結串列操作(增、刪、改、查)
*/
class SinglyLinkedList{
//首先初始化一個頭結點,不存放任何資料
private DoubleEdgedSword head = new DoubleEdgedSword(0, "", "");
public DoubleEdgedSword getHead(){
return head;
}
/**
* 向連結串列中新增資料的方法(考慮順序:自定義順序:no從小到大)
*/
public void addByOrder(DoubleEdgedSword doubleEdgedSword){
//同樣需要一個輔助節點
DoubleEdgedSword item = head;
Boolean logo = true; //用來做標識,判斷新增的資料是否存在
//
while (true){
if (item.next == null){ //節點到達了最後一個節點
break;
}
if (item.next.no > doubleEdgedSword.no){ //找到了新節點應該存放的位置
break;
}else if (item.next.no == doubleEdgedSword.no){ //說明新節點已經在連結串列中存在
logo = false;
break;
}
item = item.next; //迴圈條件
}
if (logo == false){
System.out.println("該元素已經存在於連結串列當中");
}else { //將節點插入連結串列
doubleEdgedSword.next = item.next; //新節點的next指向item的next
item.next = doubleEdgedSword; //而item的next指向新節點
}
}
/**
* 修改連結串列
* 根據no屬性查詢需要修改的節點
* 傳入新的節點資訊,來修改節點
*/
public void updateLinkedList(DoubleEdgedSword newDoubleEdgedSword){
//判斷節點是否為空
if (head.next == null){
System.out.println("節點為空~~~");
return;
}
//輔助節點
DoubleEdgedSword item = head;
Boolean logo = false; //標識是否找到需要修改的節點
//
while (true){
if (item.next == null){
break;
}
if (item.next.no == newDoubleEdgedSword.no){ //找到了需要修改的節點,將標識logo
logo = true;
break;
}
item = item.next;
}
if (logo == false){
System.out.println("連結串列中未找到排行為: " + newDoubleEdgedSword.no + " 的劍");
}else {
item.next = newDoubleEdgedSword;
}
}
/**
* 刪除連結串列中的節點
*/
public void deleteLinkedList(int no){
//判斷連結串列是否為null
if (head.next == null){
System.out.println("連結串列為空~~~");
}
//輔助節點
DoubleEdgedSword item = head;
//
while (true){
if (item.next == null){ //以及已經到最後一個節點
System.out.println("連結串列中未找到~~~");
break;
}
if (item.next.no == no){ //找到了需要刪除的節點
item.next = item.next.next;
break;
}
item = item.next;
}
}
/**
* 顯示連結串列(遍歷)
*/
public void getLinked(){
//判斷連結串列是否為null
if (head.next == null){ //頭結點的next為空,所以連結串列為空
System.out.println("連結串列為空~~~");
return;
}
//同樣因為頭結點不能動,所以我們需要定義一個輔助接點
DoubleEdgedSword temp = head;
//遍歷連結串列
while (true){
if (temp.next == null){ //當temp節點到達最後一個節點,即遍歷結束
break;
}
System.out.println(temp.next);
//將temp指向後移
temp = temp.next;
}
}
}
//寶劍類(單鏈表形式新增資料)
class DoubleEdgedSword{
public int no; //排名
public String name; //劍名
public String sName; //使用者姓名
public DoubleEdgedSword next; //指向下一個節點(下一把寶劍)
public DoubleEdgedSword(int no, String name, String sName) {
this.no = no;
this.name = name;
this.sName = sName;
}
//重寫toString方法不必列印next
@Override
public String toString() {
return "DoubleEdgedSword{" +
"no=" + no +
", name='" + name + '\'' +
", sName='" + sName + '\'' +
'}';
}
}