




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第Java鏈表數(shù)據(jù)結(jié)構(gòu)及其簡單使用方法解析目錄認(rèn)識(shí)鏈表結(jié)構(gòu)單向鏈表雙向鏈表加深對(duì)鏈表結(jié)構(gòu)的理解實(shí)現(xiàn)單向和雙向鏈表的反轉(zhuǎn)實(shí)現(xiàn)把鏈表中給定的值都刪除小結(jié)
認(rèn)識(shí)鏈表結(jié)構(gòu)
單向鏈表
單鏈表在內(nèi)存中的表示:
可以看到,一個(gè)鏈表的節(jié)點(diǎn)包含數(shù)據(jù)域和指向下一個(gè)節(jié)點(diǎn)的引用,鏈表最后一個(gè)節(jié)點(diǎn)指向null(空區(qū)域)。
我們可以根據(jù)這一定義,用Java語言表示一下單向鏈表的結(jié)構(gòu):
publicclassNode{
publicintvalue;
publicNodenext;
publicNode(intvalue){
this.value=value;
}
在鏈表的結(jié)構(gòu)中,有數(shù)據(jù)域value,以及一個(gè)指向下一個(gè)節(jié)點(diǎn)的引用next。
TIP:這里的value還可以定義成泛型的。
雙向鏈表
我們?cè)賮砜匆幌码p向鏈表的結(jié)構(gòu):
雙向鏈表中的節(jié)點(diǎn)有數(shù)值域,和指向它前一個(gè)節(jié)點(diǎn)的引用以及指向它后一個(gè)節(jié)點(diǎn)的引用,據(jù)此我們可以定義出
雙向鏈表的結(jié)構(gòu):
publicclassDoubleNode{
publicintvalue;
publicDoubleNodepre;
publicDoubleNodenext;
publicDoubleNode(intvalue){
this.value=value;
}
加深對(duì)鏈表結(jié)構(gòu)的理解
實(shí)現(xiàn)單向和雙向鏈表的反轉(zhuǎn)
說明:
對(duì)于一個(gè)鏈表如圖所示:
反轉(zhuǎn)的意思是,將原來鏈表上的節(jié)點(diǎn)指針指向反轉(zhuǎn),原來的指向是:a-b-c-d-null,變成現(xiàn)在的指向:d-c-b-a-null,
即反轉(zhuǎn)后的結(jié)構(gòu)如圖所示:
這個(gè)題目不難,我們轉(zhuǎn)換一下指針的指向就行了。
設(shè)計(jì)這樣一個(gè)函數(shù),函數(shù)的過程是調(diào)整鏈表各節(jié)點(diǎn)的指針指向,那么這個(gè)函數(shù)的要素有:
返回值是鏈表的新的頭結(jié)點(diǎn),這樣能保證函數(shù)執(zhí)行完,原鏈表變成一個(gè)有新的頭結(jié)點(diǎn)的鏈表需要傳入一個(gè)鏈表,用頭結(jié)點(diǎn)表示
解題技巧:定義兩個(gè)Node引用輔助我們反轉(zhuǎn)指針指向。
代碼實(shí)現(xiàn):
publicstaticNodereverseNode(Nodehead){
Nodepre=null;
Nodenext=null;
//最終讓head指向null
while(head!=null){
next=head.next;
head.next=pre;
pre=head;
head=next;
returnpre;
}
我們來模擬一下這個(gè)函數(shù)的執(zhí)行過程。
鏈表原始狀態(tài):
方法開始執(zhí)行,此時(shí)head.next不為空,所以,執(zhí)行如下步驟:
next=head.next:讓next指向head(當(dāng)前節(jié)點(diǎn))的下一個(gè)節(jié)點(diǎn),即b
head.next=pre:讓當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)指向pre,即null
此時(shí)當(dāng)前節(jié)點(diǎn)從原來指向b,改為指向null。
pre=head:讓pre指向當(dāng)前節(jié)點(diǎn)head=next:讓當(dāng)前節(jié)點(diǎn)指向next,相當(dāng)于移動(dòng)head節(jié)點(diǎn),直到將head節(jié)點(diǎn)移動(dòng)到原來tail節(jié)點(diǎn)的位置
第一次循環(huán)執(zhí)行結(jié)束,此時(shí)head為b,不是null,所以繼續(xù)循環(huán),執(zhí)行流程:
此時(shí)head為c,不是null,所以繼續(xù)循環(huán),執(zhí)行流程如下:
同理,此時(shí)head為d,不是null,繼續(xù)循環(huán):
這是就完成了單鏈表的反轉(zhuǎn)步驟。
有了單鏈表反轉(zhuǎn)的經(jīng)驗(yàn),我們很容易就能實(shí)現(xiàn)雙向鏈表的反轉(zhuǎn),代碼如下:
publicDoubleNodereverseDoubleNode(DoubleNodehead){
DoubleNodepre=null;
DoubleNodenext=null;
while(head!=null){
next=head.next;
//操作(移動(dòng))當(dāng)前節(jié)點(diǎn)
head.next=pre;
head.pre=next;
pre=head;
head=next;
returnpre;
}
實(shí)現(xiàn)把鏈表中給定的值都刪除
題如:給定一個(gè)單鏈表頭節(jié)點(diǎn)head,以及一個(gè)整數(shù),要求把鏈表中值為給定整數(shù)的節(jié)點(diǎn)都刪除。
實(shí)現(xiàn)思路:
要實(shí)現(xiàn)的函數(shù)需要給我傳一個(gè)頭節(jié)點(diǎn)以及給定的數(shù)值,頭節(jié)點(diǎn)確定鏈表。func(Nodehead,intnum)。函數(shù)給不給返回值,返回值是什么?試想,針對(duì)鏈表3-5-4-3-4-5,假如要?jiǎng)h除4,那么新鏈表就是3-5-3-5,頭節(jié)點(diǎn)仍然是原來的節(jié)點(diǎn)3;而如果要?jiǎng)h除值為3的節(jié)點(diǎn)呢,刪除后就是5-4-4-5,頭節(jié)點(diǎn)變了。因此,我們要設(shè)計(jì)的這個(gè)函數(shù)需要返回新鏈表的頭節(jié)點(diǎn)。上述分析得知,需要返回新鏈表的頭節(jié)點(diǎn),因此也就是要返回第一個(gè)不是給定值的節(jié)點(diǎn)(因?yàn)榻o定值的節(jié)點(diǎn)都要被刪除掉)。
//head移動(dòng)到第一個(gè)不需要?jiǎng)h除的位置:邊界條件
while(head!=null){
if(head.value!=num){
break;
//head右移
head=head.next;
//跳出循環(huán)之后,head的情況:
//1.head=null,這種情況是鏈表中的值全部是給定值,全刪了
//2.head!=null
//中間操作
//最終返回head:第一個(gè)不是給定值的節(jié)點(diǎn)
returnhead;
head移動(dòng)到第一個(gè)不需要?jiǎng)h除的位置后,head若為null,表示所有節(jié)點(diǎn)都刪除了,直接返回就可以了;若head不為null,借助兩個(gè)輔助變量Nodepre和cur,從head處開始往next走,遇到給定值就跳過。
Nodepre=head;
Nodecur=head;
while(cur!=null){
if(cur.value==num){
pre.next=cur.next;
}else{
pre=cur;
cur=cur.next;
這一執(zhí)行過程圖解如下:
通過上述分析,寫出完整實(shí)現(xiàn)代碼:
publicstaticNoderemove(Nodehead,intnum){
while(head!=null){
if(head.value!=num){
break;
head=head.next;
Nodepre=head;
Nodecur=head;
while(cur!=null){
if(cur.value==num){
pre.next=cur.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州國企招聘2025貴陽供銷集團(tuán)有限公司所屬企業(yè)第一批招聘21人筆試參考題庫附帶答案詳解
- 浙江國企招聘2025年紹興市新昌縣國有企業(yè)公開招聘工作人員66人筆試參考題庫附帶答案詳解
- 2025遼寧撫順市龍晟保安服務(wù)有限責(zé)任公司招聘20人筆試參考題庫附帶答案詳解
- 2025福建南平綠發(fā)集團(tuán)有限公司招聘28人筆試參考題庫附帶答案詳解
- 2025春季福建省港口集團(tuán)有限責(zé)任公司校園招聘219人筆試參考題庫附帶答案詳解
- 無人機(jī)物流引領(lǐng)低空經(jīng)濟(jì)新趨勢(shì)
- 《探索未知:課件中的神奇世界》
- 閱讀合同協(xié)議書
- 門面買賣合同協(xié)議書樣本
- 轉(zhuǎn)合同協(xié)議書
- 2025專利代理師筆試題庫完美版帶答案分析
- 2025企業(yè)主要負(fù)責(zé)人安全培訓(xùn)考試試題及答案典型題
- 機(jī)械樣機(jī)擺放協(xié)議書
- 2025-2030中國開關(guān)插座行業(yè)市場(chǎng)發(fā)展分析及前景趨勢(shì)與投資研究報(bào)告
- 2025年嘉興市九年級(jí)中考語文一模試卷附答案解析
- 2025年安徽數(shù)學(xué)中考第2題:科學(xué)計(jì)數(shù)法【含答案】
- 中國移動(dòng)通信集團(tuán)新疆有限公司昌吉州分公司招聘筆試題庫2025
- 2024年榆林市社區(qū)專職工作人員招聘考試真題
- 人教部編版三年級(jí)語文下冊(cè) 課課練-第21課 我不能失信(含答案)
- 2025廊坊師范學(xué)院輔導(dǎo)員考試題庫
- (二調(diào))武漢市2025屆高中畢業(yè)生二月調(diào)研考試 語文試卷(含官方答案解析)
評(píng)論
0/150
提交評(píng)論