版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Java數(shù)據(jù)結(jié)構(gòu)之雙向鏈表的實(shí)現(xiàn)目錄1雙向鏈表1.1雙向鏈表介紹1.2雙向鏈表實(shí)現(xiàn)思路2雙向鏈表實(shí)現(xiàn)完整代碼2.1節(jié)點(diǎn)類Student.java2.2雙向鏈表實(shí)現(xiàn)類StudentDoubleLinkedList.java2.3測(cè)試類StudentDoubleLinkedListDemo.java2.4結(jié)果3雙向鏈表小結(jié)
1雙向鏈表
1.1雙向鏈表介紹
相較單鏈表,雙向鏈表除了data與next域,還多了一個(gè)pre域用于表示每個(gè)節(jié)點(diǎn)的前一個(gè)元素。這樣做給雙向鏈表帶來了很多優(yōu)勢(shì):
單向鏈表查找的方向只能是一個(gè)方向,而雙向鏈表可以向前或者向后查找;
單鏈表如果想要實(shí)現(xiàn)刪除操作,需要找到待刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)。而雙向鏈表可以實(shí)現(xiàn)自我刪除。
雙向鏈表結(jié)構(gòu)示意圖如下:
1.2雙向鏈表實(shí)現(xiàn)思路
與單鏈表實(shí)現(xiàn)類似,交集部分不再贅述,詳情可參考文章:Java數(shù)據(jù)結(jié)構(gòu):?jiǎn)捂湵淼膶?shí)現(xiàn)與面試題匯總
遍歷:
與單鏈表遍歷方式一樣,同時(shí),雙向鏈表可以支持向前和向后兩種查找方式
添加:
添加到末尾
先找到雙向鏈表最后一個(gè)節(jié)點(diǎn)cur.next=newNode;newNode.pre=cur;
按照no順序添加
先判斷該鏈表是否為空,如果為空則直接添加如果不為空則繼續(xù)處理根據(jù)no遍歷鏈表,找到合適的位置newNode.next=cur.next;cur.next=newNode;newNode.pre=cur;
修改操作與單鏈表實(shí)現(xiàn)步驟一致
刪除操作:
雙向鏈表可以實(shí)現(xiàn)自我刪除直接找到待刪除的節(jié)點(diǎn)cur.pre.next=cur.next;cur.next.pre=cur.pre;需要特別注意是否為最后一個(gè)元素,如果為最后一個(gè)元素,cur.next為null,此時(shí)使用cur.next.pre會(huì)出現(xiàn)空指針異常,所以,如果為最后一個(gè)元素,則該步驟可以省略,cur.next為null即可。
以刪除紅色的2號(hào)節(jié)點(diǎn)為例:
2雙向鏈表實(shí)現(xiàn)完整代碼
2.1節(jié)點(diǎn)類Student.java
/**
*@author興趣使然黃小黃
*@version1.0
*學(xué)生類節(jié)點(diǎn)
publicclassStudentNode{
publicStringno;//學(xué)號(hào)
publicStringname;//姓名
publicintage;//年齡
publicStudentNodepre;//指向前一個(gè)節(jié)點(diǎn)
publicStudentNodenext;//指向下一個(gè)節(jié)點(diǎn)
//構(gòu)造器
publicStudentNode(Stringno,Stringname,intage){
this.no=no;
=name;
this.age=age;
//為了顯示方便
@Override
publicStringtoString(){
return"StudentNode{"+
"no='"+no+'\''+
",name='"+name+'''+
",age="+age+
'}';
2.2雙向鏈表實(shí)現(xiàn)類StudentDoubleLinkedList.java
/**
*@author興趣使然黃小黃
*@version1.0
*學(xué)生雙向鏈表的具體實(shí)現(xiàn)
publicclassStudentDoubleLinkedList{
//定義頭節(jié)點(diǎn)
privateStudentNodehead=newStudentNode("","",0);
//獲取頭節(jié)點(diǎn)
publicStudentNodegetHead(){
returnhead;
//遍歷雙向鏈表的方法
publicvoidshowList(){
//判斷鏈表是否為空
if(head.next==null){
System.out.println("當(dāng)前鏈表為空");
return;
//遍歷使用輔助指針
StudentNodetemp=head;
while(temp!=null){
//更新指針
temp=temp.next;
if(temp.next==null){
System.out.print(temp);
break;
System.out.print(temp+"---
//添加節(jié)點(diǎn)的方法
//添加到尾部
publicvoidadd(StudentNodenewNode){
//先找到最后一個(gè)節(jié)點(diǎn)
StudentNodecur=head;
while(true){
//到達(dá)最后退出循環(huán)
if(cur.next==null){
break;
//更新指針
cur=cur.next;
//添加操作
newNode.next=cur.next;//也可以省略,因?yàn)楹銥閚ull
cur.next=newNode;
newNode.pre=cur;
//添加節(jié)點(diǎn)的方法
//根據(jù)學(xué)號(hào)順序添加
publicvoidaddByOrder(StudentNodenewNode){
//如果當(dāng)前鏈表為空,則直接添加
if(head.next==null){
head.next=newNode;
newNode.pre=head;
return;
//按照學(xué)號(hào)找到對(duì)應(yīng)位置
StudentNodecur=head;
booleanflag=false;//標(biāo)識(shí)待添加的no是否存在
while(true){
if(cur.next==null){
//已經(jīng)到達(dá)鏈表的尾部
break;
}elseif(Integer.parseInt(cur.next.no)==Integer.parseInt(newNode.no)){
//已經(jīng)存在
flag=true;
break;
}elseif(Integer.parseInt(cur.next.no)Integer.parseInt(newNode.no)){
//位置找到
break;
cur=cur.next;
if(flag){
System.out.println("當(dāng)前no已經(jīng)存在,無法添加!");
}else{
//添加操作
newNode.next=cur.next;
cur.next=newNode;
newNode.pre=cur;
//根據(jù)no學(xué)號(hào)修改學(xué)生信息
publicvoidupdate(StudentNodestudentNode){
if(head.next==null){
System.out.println("當(dāng)前鏈表為空,無法修改");
return;
StudentNodetemp=head.next;
booleanflag=false;//表示是否找到節(jié)點(diǎn)
while(true){
if(temp==null){
break;
if(temp.no==studentNode.no){
flag=true;
break;
temp=temp.next;
if(flag){
=studentN;
temp.age=studentNode.age;
System.out.println("更新成功!");
}else{
System.out.println("沒有找到");
//從雙向鏈表中刪除節(jié)點(diǎn)
publicvoiddelete(Stringno){
//直接找到對(duì)應(yīng)no的節(jié)點(diǎn)直接刪除
StudentNodecur=head.next;
booleanflag=false;//標(biāo)記是否找到
while(true){
if(cur==null){
break;
if(cur.no.equals(no)){
flag=true;//找到了
break;
cur=cur.next;
if(flag){
//刪除操作
//注意考慮最后一個(gè)節(jié)點(diǎn)后一個(gè)為空的情況
if(cur.next!=null){
cur.next.pre=cur.pre;
cur.pre.next=cur.next;
System.out.println("刪除成功!");
}else{
System.out.println(no+"節(jié)點(diǎn)不存在,無法刪除!");
2.3測(cè)試類StudentDoubleLinkedListDemo.java
/**
*@author興趣使然黃小黃
*@version1.0
*雙向鏈表測(cè)試類
publicclassDoubleLinkedListDemo{
publicstaticvoidmain(String[]args){
StudentDoubleLinkedListdoubleLinkedList=newStudentDoubleLinkedList();
doubleLinkedList.addByOrder(newStudentNode("1","黃小黃",20));
doubleLinkedList.addByOrder(newStudentNode("3","懶羊羊",20));
doubleLinkedList.addByOrder(newStudentNode("2","沸羊羊",25));
doubleLinkedList.addByOrder(newStudentNode("4","美羊羊",15));
System.out.println("遍歷:");
doubleLinkedList.showList();
//測(cè)試更新方法
System.out.println("\n更新編號(hào)為4的信息后:");
doubleLinkedList.update(newStudentNode("4","禰豆子",14));
doubleLinkedList.showList();
//測(cè)試刪除方法
System.out.println("\n刪除第一個(gè)和最后一個(gè):");
doubleLinkedList.delete("1");
doubleLinkedList.delete("4");
doubleLinkedList.showList();
2.4結(jié)果
遍歷:
StudentNode{no=1,name=黃小黃,age=20}---StudentNode{no=2,name=沸羊羊,age=25}---StudentNode{no=3,name=懶羊羊,age=20}---StudentNode{no=4,name=美羊羊,age=15}
更新編號(hào)為4的信息后:
更新成功!
StudentNode{no=1,name=黃小黃,age=20}---StudentNode{no=2,name=沸羊羊,age=25}---StudentNode{no=3,name=懶羊羊,age=20}---StudentNode{no=4,name=禰豆子,age=14}
刪除第一個(gè)和最后一個(gè):
刪除成功!
刪除成功!
StudentNode{no=2,name=沸羊羊,age=25}---StudentNode{no=3,name=懶羊羊,age=20}
Processfi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 執(zhí)業(yè)獸醫(yī)考試考試題預(yù)防科目及答案
- 煙花爆竹考試題及答案
- 監(jiān)護(hù)人防溺水測(cè)試題附答案
- 幼兒教育題庫(kù)論述題及答案
- 二建網(wǎng)絡(luò)考試題及答案
- 新安全生產(chǎn)法試題庫(kù)及參考答案
- 中藥試題+答案
- 重癥醫(yī)學(xué)科考試試題與答案
- 陜西省延安市輔警公共基礎(chǔ)知識(shí)題庫(kù)(附答案)
- 客服營(yíng)銷面試試題及答案
- 2026中國(guó)電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會(huì)成熟人才招聘?jìng)淇碱}庫(kù)及參考答案詳解1套
- 2025年廣東省生態(tài)環(huán)境廳下屬事業(yè)單位考試真題附答案
- 2026年安徽省公務(wù)員考試招錄7195名備考題庫(kù)完整參考答案詳解
- 【地理】期末模擬測(cè)試卷-2025-2026學(xué)年七年級(jí)地理上學(xué)期(人教版2024)
- LoRa技術(shù)教學(xué)課件
- GB/T 1957-2006光滑極限量規(guī)技術(shù)條件
- GB 28480-2012飾品有害元素限量的規(guī)定
- 劉一秒演說智慧經(jīng)典(內(nèi)部筆記)
- 管道TOFD檢測(cè)記錄及續(xù)表
- 馬克思主義哲學(xué)精講課件
- 期末考試總安排
評(píng)論
0/150
提交評(píng)論