單連結串列實現原理以及具體程式碼(java)
單連結串列
一、什麼是單連結串列?
單連結串列是一種鏈式存取的資料結構,以節點的方式鏈式儲存資料,每個節點包含date域和next域(指向下一個節點),連結串列分為帶頭結點和不帶頭結點。
二、實現原理
單連結串列就是每個節點的next域指向下一個節點。
連結串列是需要自定義實現的,關鍵在於下面兩點:
1.在建立需要單連結串列儲存的物件時,定義一個該物件的屬性next,用於表示下一個節點。(這樣的話,doubleEdgedSword.next就可以表示下一個節點)
2.第二點就是通過連結串列新增資料時,需要定義一個頭結點(DoubleEdgedSword head = new DoubleEdgedSword(0,null,null));
同時因為頭結點不能動,又需要新增一個輔助節點(DoubleEdgedSword item = head),用於在遍歷時指定節點
二、使用步驟
程式碼實現(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 + '\'' +
'}';
}
}
相關文章
- 連結串列-單連結串列實現
- 【資料結構】連結串列(單連結串列實現+詳解+原碼)資料結構
- Python實現單連結串列Python
- 基本資料結構實現--單連結串列【含測試程式碼】資料結構
- Java實現單向連結串列基本功能Java
- go 實現單向連結串列Go
- java實現連結串列反轉Java
- java實現雙向連結串列Java
- 演算法與資料結構-連結串列((linked-list)-Java實現單向連結串列演算法資料結構Java
- 單連結串列建立連結串列出現問題
- 圖解雙連結串列(Java實現)圖解Java
- Java實現連結串列帶註釋Java
- 資料結構_連結串列的原理與應用1_單連結串列(基於C語言實現)資料結構C語言
- js實現資料結構--單連結串列JS資料結構
- java實現單連結串列、棧、佇列三種資料結構Java佇列資料結構
- 連結串列 - 單向連結串列
- Python實現單向連結串列詳解Python
- 單向迴圈連結串列的實現
- 單連結串列實現增刪改查
- 資料結構 - 單連結串列 C++ 實現資料結構C++
- 環形連結串列I、II(含程式碼以及證明)
- 資料結構和演算法——Go實現單連結串列並且反轉單連結串列資料結構演算法Go
- FreeRTOS連結串列實現
- 小影片程式碼,反轉連結串列的實現思路分析
- DS單連結串列--類實現(未完成)
- 基本資料結構實現--雙連結串列【含測試程式碼】資料結構
- 資料結構——單連結串列的C++實現資料結構C++
- 資料結構之php實現單向連結串列資料結構PHP
- 單連結串列
- Rust 程式設計,用連結串列實現棧Rust程式設計
- Java解釋單連結串列中的頭插法以及尾插法Java
- 實現雙向連結串列
- 用JavaScript實現功能齊全的單連結串列JavaScript
- 【程式碼隨想錄】二、連結串列:2、設計連結串列
- 【程式碼隨想錄】二、連結串列:1、移除連結串列元素
- 資料結構實驗之連結串列五:單連結串列的拆分資料結構
- 簡單介紹python中的單向連結串列實現Python
- 資料結構-單連結串列、雙連結串列資料結構