資料結構04——單連結串列
連結串列基本介紹
單連結串列
應用例項
實現程式碼
package list;
import java.beans.beancontext.BeanContext;
import java.time.temporal.Temporal;
/**
* @program: DataStructures
* description:
* @author: Mr.Zhang
* @create: 2020-28-06_20:28
**/
public class SingleListDemo {
public static void main(String[] args) {
// 測試
// 1. 首先新增四個節點,普通方法
SingleList singleList = new SingleList();
// singleList.addLink(new HeroLink(2, "宋江", "及時雨"));
// singleList.addLink(new HeroLink(1, "魯智深", "花和尚"));
// singleList.addLink(new HeroLink(4, "林沖", "豹子頭"));
// singleList.addLink(new HeroLink(3, "柴進", "小旋風"));
// 首先新增四個節點,順序插入方法
singleList.addLinkByOrder(new HeroLink(2, "宋江", "及時雨"));
singleList.addLinkByOrder(new HeroLink(1, "魯智深", "花和尚"));
singleList.addLinkByOrder(new HeroLink(4, "林沖", "豹子頭"));
singleList.addLinkByOrder(new HeroLink(3, "柴進", "小旋風"));
// singleList.addLinkByOrder(new HeroLink(3, "柴進", "小旋風"));
// 2. 列印單連結串列
singleList.showList();
// 修改元素測驗
// singleList.updateLink(new HeroLink(2, "宋江", "及時雨-----"));
// 列印修改後的連結串列
// singleList.showList();
// 刪除最後一個元素
// singleList.delLastLink();
// singleList.delLastLink();
// singleList.delLastLink();
// singleList.delLastLink();
// singleList.delLastLink();
// // 再列印
// singleList.showList();
// 測試根據id刪除節點
singleList.delLinkById(12);
// singleList.delLinkById(1);
// singleList.delLinkById(3);
// singleList.delLinkById(4);
// 列印
System.out.println("刪除後:");
singleList.showList();
}
}
// 單連結串列類
class SingleList {
// 頭節點
private HeroLink head = new HeroLink(0, "", "");
// 新增節點
public void addLink(HeroLink heroLink) {
HeroLink temp = head;
// 遍歷直到找到最後一個節點,然後把最後一個節點的next指向新新增節點
while (true) {
// 如果next為空,則說明是temp指向了最後一個節點,則指向新節點
if (temp.next == null) {
temp.next = heroLink;
break;
}
// temp後移
temp = temp.next;
}
}
// 第二種新增節點的方式,通過排名來新增
public void addLinkByOrder(HeroLink heroLink) {
// 指標
HeroLink temp = head;
boolean flag = false; // 用於判斷是否有編號重複的元素插入
while (true) {
// 1. 判斷是否新增過元素,若沒有,則跳出
if (temp.next == null) {
// 沒有新增過元素
break;
}
// 2. 判斷新的元素的id是否等於temp.next的id,若等於,則跳出迴圈,同時置flag為true
if (heroLink.id == temp.next.id) {
flag = true;
break;
}
// 3. 判斷新的元素的id是否小於temp.next的id,若小於,則找到位置,跳出迴圈
if (heroLink.id < temp.next.id) {
break;
}
// 不滿足上述條件,說明沒有找到合適的位置
// 指標temp後移
temp = temp.next;
}
if (flag) {
// 說明id重複
System.out.println("id號重複,不能插入此元素" + heroLink.id);
}else {
// 對元素進行插入操作
// 1. 新元素指向temp.next
heroLink.next = temp.next;
// 2. temp指向新元素
temp.next = heroLink;
}
}
// 修改連結串列的內容,注意編號不能修改
public void updateLink(HeroLink heroLink) {
boolean flag = false; // 用於判斷是否找到了所要修改的元素
// 判斷是否有元素
if (head.next == null) {
// 沒有元素
return;
}
// 獲得指標
HeroLink temp = head.next;
while (true) {
if (temp.next == null) {
// 遍歷完成,沒有找到元素
break;
}
// 判斷是否找到了所要修改的元素
if (heroLink.id == temp.next.id) {
// 找到了,置flag為true,跳出迴圈
flag = true;
break;
}
// 指標後移
temp = temp.next;
}
if (flag) {
// 找到元素,進行修改, 只修改暱稱
temp.nickName = heroLink.nickName;
}else {
System.out.println("沒有查到要修改的元素!!!");
}
}
// 顯示列表內容
public void showList() {
HeroLink temp = head;
// 首先判斷單連結串列是否為空
if (temp.next == null) {
System.out.println("單連結串列為空");
return;
}
// 遍歷直到找到最後一個節點,然後把最後一個節點的next指向新新增節點
while (true) {
// 如果next為空,則說明是temp指向了最後一個節點, 退出迴圈
if (temp.next == null) {
break;
}
// 否則temp指向下一個節點
temp = temp.next;
System.out.println(temp);
}
}
// 刪除單連結串列的最後一個節點
public void delLastLink() {
HeroLink temp = head;
if (temp.next == null) {
System.out.println("無元素可以刪除,連結串列為空!!!");
return;
}
while (true) {
if (temp.next.next == null) {
temp.next = null;
break;
}
temp = temp.next;
}
}
// 刪除指定編號的節點
public void delLinkById(int id) {
// 1. 判斷此連結串列是否為空
if (head.next == null) {
System.out.println("此連結串列為空。。");
return;
}
// 2. 查詢此編號,根據flag決定狀態,是否查詢到
boolean flag = false;
HeroLink temp = head; // 指向第一個元素
while (true) {
// 判斷是否到達最後一個節點
if (temp.next == null) {
// 遍歷結束,沒找到
break;
}
// 到這因為肯定有至少一個元素
if (temp.next.id == id) {
// 找到了
flag = true;
break;
}
temp = temp.next;
}
// 3. 根據flag決定是否刪除元素
if (flag) {
// 找到了元素,進行刪除
// if (temp.next.next == null) {
// // 此種是刪除最後一個元素
// temp.next = null;
// }else
// // 否則就是刪除中間元素
temp.next = temp.next.next;
}else
System.out.println("沒找到此元素:" + id);
}
}
// 英雄類,也就是節點類
class HeroLink {
public int id;
public String name;
public String nickName;
public HeroLink next;
// 建構函式,初始化
public HeroLink(int id, String name, String nickName) {
this.id = id;
this.name = name;
this.nickName = nickName;
}
// 列印
@Override
public String toString() {
return "HeroLink{" +
"id=" + id +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
相關文章
- 資料結構-單連結串列、雙連結串列資料結構
- 資料結構之單連結串列資料結構
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 【資料結構】連結串列(單連結串列實現+詳解+原碼)資料結構
- 資料結構實驗之連結串列五:單連結串列的拆分資料結構
- 資料結構之連結串列篇(單連結串列的常見操作)資料結構
- 資料結構 - 連結串列資料結構
- 連結串列-資料結構資料結構
- 資料結構—連結串列資料結構
- 資料結構--連結串列資料結構
- 資料結構-連結串列資料結構
- 【資料結構】線性表-單連結串列資料結構
- js實現資料結構--單連結串列JS資料結構
- 畫江湖之資料結構【第一話:連結串列】單向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 單向連結串列資料結構
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 資料結構 - 單連結串列 C++ 實現資料結構C++
- 資料結構之連結串列資料結構
- 資料結構之「連結串列」資料結構
- JavaScript資料結構--連結串列JavaScript資料結構
- 資料結構之連結串列:206. 反轉連結串列資料結構
- 探索資料結構:單連結串列的實戰指南資料結構
- 資料結構——單連結串列的C++實現資料結構C++
- 資料結構之php實現單向連結串列資料結構PHP
- 資料結構:跳躍連結串列資料結構
- 資料結構——雙向連結串列資料結構
- 資料結構之連結串列操作資料結構
- JAVA資料結構之連結串列Java資料結構
- JavaScript資料結構 之 連結串列JavaScript資料結構
- js資料結構--連結串列(likedList)JS資料結構
- 資料結構基礎 連結串列資料結構
- Java版-資料結構-連結串列Java資料結構
- 資料結構學習--連結串列資料結構
- 資料結構之連結串列【上】資料結構
- JS資料結構(四)——連結串列JS資料結構
- 前端資料結構--線性結構-連結串列前端資料結構
- 資料結構和演算法——Go實現單連結串列並且反轉單連結串列資料結構演算法Go
- 資料結構實驗之連結串列二:逆序建立連結串列資料結構