java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單鏈表與雙向鏈表
單鏈表:
每個(gè)數(shù)據(jù)是以節(jié)點(diǎn)的形式存在的
每個(gè)節(jié)點(diǎn)分為數(shù)據(jù)域和指針域
數(shù)據(jù)域中保存該節(jié)點(diǎn)的數(shù)據(jù)
指針域中保存指向下一個(gè)節(jié)點(diǎn)的指針
實(shí)現(xiàn)思路:
節(jié)點(diǎn)類SingleNode中保存數(shù)據(jù)和指向下一個(gè)節(jié)點(diǎn)的指針
單鏈表類SingleLinkedList中保存鏈表的頭節(jié)點(diǎn),實(shí)現(xiàn)相關(guān)鏈表方法
對(duì)于鏈表方法,涉及到位置查找,如在指定位置增加、刪除節(jié)點(diǎn),需要使用一個(gè)臨時(shí)變量temp從頭節(jié)點(diǎn)開始遍歷,直至找到對(duì)應(yīng)的位置。
對(duì)于節(jié)點(diǎn)的增加刪除,只需要修改相關(guān)結(jié)點(diǎn)的指針指向即可
代碼實(shí)現(xiàn):
節(jié)點(diǎn)類SingleNode:
public class SingleNode {
public int data;
public SingleNode next;
public SingleNode(int data) {
this.data = data;
}
@Override
public String toString() {
return "SingleNode{" + "data=" + data + '}';
}
}
單鏈表類SingleLinkedList:
public class SingleLinkedList {
private SingleNode head = new SingleNode(0);
//獲取頭結(jié)點(diǎn)
public SingleNode getHead(){
return head;
}
//添加節(jié)點(diǎn)
public void add(SingleNode singleNode) {
SingleNode temp = head;
//找到鏈表最后一個(gè)節(jié)點(diǎn)
while (temp.next != null) {
temp = temp.next;
}
temp.next = singleNode;
}
//按順序添加節(jié)點(diǎn)
public void addByOrder(SingleNode singleNode) {
SingleNode temp = head;
while (true) {
if (temp.next == null) {
//已經(jīng)遍歷到鏈表最后了
break;
} else if (temp.next.data > singleNode.data) {
//找到應(yīng)插入的位置
break;
}
temp = temp.next;
}
singleNode.next = temp.next;
temp.next = singleNode;
}
//刪除節(jié)點(diǎn)
public void delete(int data) {
SingleNode temp = head;
boolean flag = false; //標(biāo)志是否找到待刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)
while (true) {
if (temp.next == null) {
//已經(jīng)遍歷到鏈表最后了
break;
} else if (temp.next.data == data) {
//找到待刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
} else {
System.out.println("要?jiǎng)h除的節(jié)點(diǎn)不存在");
}
}
//輸出鏈表
public void show() {
//判斷鏈表是否為空
if (head.next == null) {
System.out.println("鏈表為空");
return;
}
SingleNode temp = head.next;
while (temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
}
雙向鏈表:
每個(gè)節(jié)點(diǎn)中除了保存了指向后一個(gè)節(jié)點(diǎn)的指針外,還保存了指向前一個(gè)節(jié)點(diǎn)的指針
實(shí)現(xiàn)思路:
相關(guān)方法實(shí)現(xiàn)與單鏈表類似,不同點(diǎn)在于需要增加對(duì)指向前一個(gè)節(jié)點(diǎn)的指針的更改
代碼實(shí)現(xiàn):
節(jié)點(diǎn)類DoubleNode:
public class DoubleNode {
public int data;
public DoubleNode next;
public DoubleNode pre;
public DoubleNode(int data) {
this.data = data;
}
@Override
public String toString() {
return "DoubleNode{" + "data=" + data + '}';
}
}
雙向鏈表類DoubleLinkedList:
public class DoubleLinkedList {
public DoubleNode head = new DoubleNode(0);
//獲取頭結(jié)點(diǎn)
public DoubleNode getHead() {
return head;
}
//添加節(jié)點(diǎn)
public void add(DoubleNode doubleNode) {
DoubleNode temp = head;
//找到鏈表最后一個(gè)節(jié)點(diǎn)
while (temp.next != null) {
temp = temp.next;
}
temp.next = doubleNode;
doubleNode.pre = temp;
}
//刪除節(jié)點(diǎn)
public void delete(int data) {
DoubleNode temp = head.next;
boolean flag = false; //標(biāo)志是否找到待刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)
while (true) {
if (temp == null) {
//已經(jīng)遍歷到鏈表最后了
break;
} else if (temp.data == data) {
//找到待刪除節(jié)點(diǎn)
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.pre.next = temp.next;
if (temp.next != null) {
//若刪除節(jié)點(diǎn)不為最后一個(gè)節(jié)點(diǎn)
temp.next.pre = temp.pre;
}
} else {
System.out.println("要?jiǎng)h除的節(jié)點(diǎn)不存在");
}
}
//輸出鏈表
public void show() {
//判斷鏈表是否為空
if (head.next == null) {
System.out.println("鏈表為空");
return;
}
DoubleNode temp = head.next;
while (temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
}
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解
- Java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中重復(fù)的結(jié)點(diǎn)
- Java實(shí)現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的方法
- 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之鏈表
- Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之環(huán)形鏈表
- Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之單向鏈表
- Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的鏈表的概念與實(shí)現(xiàn)
- Java數(shù)據(jù)結(jié)構(gòu)之雙向鏈表圖解
- Java鏈表數(shù)據(jù)結(jié)構(gòu)及其簡(jiǎn)單使用方法解析
相關(guān)文章
如果淘寶的七天自動(dòng)確認(rèn)收貨讓你設(shè)計(jì)你用Java怎么實(shí)現(xiàn)
在面試的時(shí)候如果面試官問淘寶的七天自動(dòng)確認(rèn)收貨讓你設(shè)計(jì),你會(huì)怎么具體實(shí)現(xiàn)呢?跟著小編看一下下邊的實(shí)現(xiàn)過程,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-09
Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:插入排序 Insertion Sort
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:插入排序 Insertion Sort,本文直接給出實(shí)例代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06
SpringBoot 中 AutoConfiguration的使用方法
這篇文章主要介紹了SpringBoot 中 AutoConfiguration的使用方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
SpringBoot整合RabbitMQ實(shí)現(xiàn)交換機(jī)與隊(duì)列的綁定
這篇文章將通過幾個(gè)實(shí)例為大家介紹一些SpringBoot中RabbitMQ如何綁定交換機(jī)(交換器)與隊(duì)列,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05
SpringCloud基于RestTemplate微服務(wù)項(xiàng)目案例解析
這篇文章主要介紹了SpringCloud基于RestTemplate微服務(wù)項(xiàng)目案例,在寫SpringCloud搭建微服務(wù)之前,先搭建一個(gè)不通過springcloud只通過SpringBoot和Mybatis進(jìn)行模塊之間通訊,通過一個(gè)案例給大家詳細(xì)說明,需要的朋友可以參考下2022-05-05
SpringSecurity?Web權(quán)限方案實(shí)現(xiàn)全過程
Spring Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和授權(quán)框架,專門用于保護(hù)Java應(yīng)用程序的Web集成,下面這篇文章主要給大家介紹了關(guān)于SpringSecurity?Web權(quán)限方案實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2024-01-01
迅速學(xué)會(huì)@ConfigurationProperties的使用操作
這篇文章主要介紹了迅速學(xué)會(huì)@ConfigurationProperties的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

