單連結串列基本介紹以及按照順序插入節點
連結串列介紹:
連結串列是有序的列表,但是在記憶體中他是這樣儲存的:
由上圖可知:
- 連結串列是以節點儲存的,是鏈式儲存。
- 節點中包含data域,next域,data域存資料,next域儲存下一個節點。
- 連結串列的各個節點不一定是連續儲存的
- 連結串列分為帶頭節點的連結串列和不帶頭節點的連結串列
單連結串列的邏輯示意圖如下:
實際上,邏輯上看似按順序a1-a2-a3…但不一定!!
單連結串列的應用例項:
使用帶head頭節點的單向連結串列實現 水滸排行榜管理完成對英雄人物的增刪改查操作!
- 第一種方法在新增英雄時,直接新增到連結串列的尾部
思路分析:
新增(建立)
1. 由於head頭結點不能動,所以需要藉助輔助變數實現。 頭節點只代表單連結串列的頭
2. 直接將節點新增到連結串列尾部。需要通過遍歷找到連結串列尾部,再將節點新增進去
遍歷連結串列:
通過1個輔助變數遍歷,幫助遍歷整個連結串列
程式碼實現:
//建立單連結串列
class singleLinkedList {
//首先建立一個頭結點,作用只是代表單連結串列的頭
private HeroNode head = new HeroNode(0, "", "");
// 新增節點
public void add(HeroNode heroNode) {
//因為我們的頭結點不能動,所以需要建立一個輔助變數temp
HeroNode temp = head;
//迴圈,判斷節點是否是最後一個節點
while (true) {
if (temp.next == null) { //表名當前是最後一個節點
break;
}
//表明當前不是最後一個節點,將temp 後移
temp = temp.next;
}
//表明是最後節點,將新的節點賦值給最後這個節點的next
temp.next = heroNode;
}
//顯示連結串列【遍歷】
public void list() {
if (head.next == null) {
System.out.println("連結串列為空!~");
return;
}
//上面已經判斷過連結串列是否為空,所以下面是連結串列不為空的時候
// 遍歷連結串列: 因為頭結點不能動,所以需要一個輔助變數。
HeroNode temp = head.next;
while (true) {
//## 我寫錯的程式碼,導致的結果 最後一個node不顯示!
//if (##temp.next## == null) {//遍歷到最後一個節點
if (temp == null){
break; //跳出迴圈
}
//輸出節點資訊
System.out.println(temp);
//還沒有遍歷到最後的節點,所以要後移temp
temp = temp.next;
}
}
}
class HeroNode { //節點
public int no; //編號
public String name;
public String nickname;
public HeroNode next; //next域, 指向下一個節點
public HeroNode(int no, String name, String nickname) {
this.no = no;
this.name = name;
this.nickname = nickname;
}
//顯示節點
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
測試程式碼:
public class SingleLinkedListDemo {
public static void main(String[] args) {
// 建立節點
HeroNode hero1 = new HeroNode(1, "宋江", "及時雨");
HeroNode hero2 = new HeroNode(2, "盧俊義", "玉麒麟");
HeroNode hero3 = new HeroNode(3, "豹子頭", "林沖");
HeroNode hero4 = new HeroNode(4, "花和尚", "魯智深");
//建立連結串列:
singleLinkedList singleLinkedList = new singleLinkedList();
//新增節點到連結串列中
singleLinkedList.add(hero1);
singleLinkedList.add(hero2);
singleLinkedList.add(hero3);
singleLinkedList.add(hero4);
//遍歷 輸出節點
singleLinkedList.list();
}
}
- 第二種方法,按照排名新增英雄插入到指定位置(如果有這個排名,則新增失敗,並給出提示資訊)
思路分析示意圖:
需要按照編號的順序新增:
1.首先需要先找到新新增節點的位置,需要藉助輔助變數來搞定
1.1 遍歷連結串列,
1.1.1判斷連結串列是否為空
1.1.2 判斷temp.next.no > 新節點.no,找到新節點的位置
1.1.3 判斷編號是否已存在
2.新節點.next = temp.next
3.temp.next = 新節點
程式碼實現:
public void addByOrder(HeroNode heroNode){
//頭結點不能動,所以需要藉助輔助變數來完成
HeroNode temp = head;
boolean flag = false;//flag表示編號是否存在,預設false不存在。
//遍歷連結串列
while (true) { //
if (temp.next == null){ //表示連結串列為空,直接退出迴圈
break;//退出迴圈
}
if (temp.next.no > heroNode.no){//找到插入的位置,在temp後面,
break;//退出迴圈
}else if (temp.next.no == heroNode.no){//表示編號已存在,將flag置為true
flag = true;
break; //退出迴圈
}
//否則,temp後移,繼續遍歷當前連結串列
temp = temp.next;
}
//根據flag判斷是否可以新增節點
if (flag){//編號已經存在,不可以新增節點,給出提示資訊
System.out.printf("%d編號已經存在,不能新增節點",heroNode.no);
}else{ //編號不存在,可以新增節點
heroNode.next = temp.next;
temp.next = heroNode;
}
}
遍歷連結串列的方法和方法一相同,這邊就不給出了,可以參考上面。
這時,我們再測試一下:
public class SingleLinkedListDemo {
public static void main(String[] args) {
// 建立節點
HeroNode hero1 = new HeroNode(1, "宋江", "及時雨");
HeroNode hero2 = new HeroNode(2, "盧俊義", "玉麒麟");
HeroNode hero3 = new HeroNode(3, "豹子頭", "林沖");
HeroNode hero4 = new HeroNode(4, "花和尚", "魯智深");
//建立連結串列:
singleLinkedList singleLinkedList = new singleLinkedList();
//新增節點到連結串列中
// singleLinkedList.add(hero1);
// singleLinkedList.add(hero2);
// singleLinkedList.add(hero3);
// singleLinkedList.add(hero4);
//按照排名順序插入節點
singleLinkedList.addByOrder(hero2);
singleLinkedList.addByOrder(hero1);
singleLinkedList.addByOrder(hero4);
singleLinkedList.addByOrder(hero3);
//遍歷 輸出節點
singleLinkedList.list();
}
}
相關文章
- 雙向連結串列 尾節點插入
- 結點插入到單連結串列中
- 連結串列,樹,順序表操縱
- [演算法]向有序的環形單連結串列中插入新節點演算法
- 【連結串列問題】刪除單連結串列的中間節點
- 單連結串列-相鄰節點交還
- 資料結構實驗之連結串列一:順序建立連結串列資料結構
- 單向迴圈連結串列——查詢、刪除、插入結點
- 【連結串列問題】打卡3:刪除單連結串列的中間節點
- 【資料結構與演算法學習】線性表(順序表、單連結串列、雙向連結串列、迴圈連結串列)資料結構演算法
- 特定深度節點連結串列
- 連結串列入門與插入連結串列
- 資料結構練習題(順序表和單連結串列)C++資料結構C++
- 連結串列基礎2(超簡單)--單連結串列的插入和刪除
- 【連結串列問題】打卡2:刪除單連結串列的第 K個節點
- 簡單介紹python中的單向連結串列實現Python
- 單連結串列的排序(插入,選擇,冒泡)排序
- 雙向連結串列————查詢、刪除、插入結點
- 連結串列-插入排序排序
- 單連結串列功能函式練習——按規定插入指定節點及刪除最小值節點(C語言)函式C語言
- 棧是按照順序且連續儲存值
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- K個節點翻轉連結串列
- JavaScript資料結構之連結串列--介紹JavaScript資料結構
- 磁碟順序寫的介紹
- 連結串列 - 單向連結串列
- [連結串列]leetcode1019-連結串列中的下一個更大節點LeetCode
- Redis筆記 — 連結串列和連結串列節點的API函式(三)Redis筆記API函式
- 55-將單連結串列原地逆置(有頭結點的單連結串列)
- 單向連結串列————遍歷、查詢、插入結點 (基於C語言實現)C語言
- 連結串列-單連結串列實現
- 雙向迴圈連結串列————遍歷、查詢、插入結點
- 圖解帶頭節點的單連結串列的反轉操作圖解
- 資料結構初階--二叉樹介紹(基本性質+堆實現順序結構)資料結構二叉樹
- 2024/11/27 【連結串列】LeetCode 24 兩兩交換連結串列中的節點 & LeetCode 19 刪除連結串列的倒數第N個節點LeetCode
- 單連結串列
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- leetcode----刪除連結串列中的節點LeetCode