“基于鏈表實(shí)現(xiàn)數(shù)據(jù)合并功能”教學(xué)思路
說在前面
在掌握了創(chuàng)建鏈表,和對(duì)鏈表進(jìn)行查、改、增、刪基本操作后,有必要解決一些綜合性問題來加深對(duì)鏈表概念和算法原理的理解。教材2.2.1例1“基于鏈表實(shí)現(xiàn)數(shù)據(jù)合并功能”是對(duì)第一章中使用鏈表合并數(shù)據(jù)的算法細(xì)化和編程實(shí)現(xiàn),需要結(jié)合示意圖動(dòng)畫演示來理解代碼,并進(jìn)一步思考代碼優(yōu)化方法。
教材文本
(相關(guān)資料圖)
教材處理例1雖然是對(duì)第一章中合并鏈表a和b的算法實(shí)現(xiàn),但并沒有與其保持完全一致。第一章中,為了方便描述算法,增設(shè)了一個(gè)空頭節(jié)點(diǎn),而例1則沒有使用空頭節(jié)點(diǎn);此外,例1并沒有直接創(chuàng)建具有確切值的鏈表,而是通過先創(chuàng)建空鏈表,再使用尾插法插入新節(jié)點(diǎn)的方式,生成了一個(gè)降序排列的單鏈表。為了降低教學(xué)難度,我們可以先創(chuàng)建好鏈表a和b,把教學(xué)重點(diǎn)放在合并鏈表上。然后單獨(dú)來分析尾插法和頭插法的區(qū)別。
學(xué)生任務(wù)單
閱讀教材P47例1“基于鏈表實(shí)現(xiàn)數(shù)據(jù)合并功能”,思考如下問題:(1)書中程序是如何生成降序序列的?新節(jié)點(diǎn)是在鏈表頭部還是尾部插入的?(2)若從鏈表頭部插入新節(jié)點(diǎn)來生成降序序列,該如何編寫代碼?(3)假設(shè)我們已經(jīng)創(chuàng)建好了鏈表a和b,只需在鏈表a的基礎(chǔ)上,把鏈表b的元素插入到a中,以實(shí)現(xiàn)合并鏈表功能。試比較如下程序與教材程序的異同,并完成填空。a = [[19,1],[16,2],[12,3],[8,4],[5,-1]]
b = [[20,1],[15,2],[14,3],[10,4],[4,-1]]
head_a = head_b = 0
#在鏈表a的基礎(chǔ)上,把鏈表b的元素插入到a,以列表a為存儲(chǔ)空間,構(gòu)造新的鏈表
pre = p = head_a
q = head_b
while q != -1:
if p != -1 and a[p][0] >= b[q][0]: # 節(jié)點(diǎn)p非空且值不小于節(jié)點(diǎn)q
pre =填空1
p =填空2
else:
a.append(填空3) # 將節(jié)點(diǎn)q插入到列表a的尾部,以p為后繼節(jié)點(diǎn)
if p == head_a: # 若節(jié)點(diǎn)p為頭節(jié)點(diǎn),需將q作為新的頭節(jié)點(diǎn)
pre = head_a =填空4 # 更新頭指針和pre
else:
a[pre][1] =填空5 # 將pre的后繼指針指向節(jié)點(diǎn)q
pre =填空6 # 將pre指向其后繼節(jié)點(diǎn)
q =填空7 # 處理鏈表b的下一個(gè)結(jié)點(diǎn)
問題解析(1)書中程序先創(chuàng)建一個(gè)空鏈表,然后生成第一個(gè)節(jié)點(diǎn),并為其賦值為[95,100]范圍內(nèi)的隨機(jī)整數(shù);然后依次從鏈表尾部插入新節(jié)點(diǎn),每個(gè)新節(jié)點(diǎn)都比其前驅(qū)節(jié)點(diǎn)小[1,5]的隨機(jī)數(shù);本來使用尾插法是需要定位尾節(jié)點(diǎn)的,因?yàn)槊看味际菑奈膊坎迦?,故程序默認(rèn)尾節(jié)點(diǎn)的下標(biāo)為(i-1),其中i表示當(dāng)前列表長(zhǎng)度。
(2)若從鏈表頭部插入新節(jié)點(diǎn)來生成降序序列,則需要更新頭指針,并按照升序序列來插入新節(jié)點(diǎn)。核心代碼為:
#生成a鏈表
a = []
head_a = -1
tmp=randint(1,5) #添加頭節(jié)點(diǎn)
a.append([tmp,head_a])
head_a = 0
for i in range(1,5): #依次生成遞增數(shù)
tmp = a[head_a][0] + randint(1,5)
a.append([tmp,head_a]) # 插入到鏈表頭部
head_a = len(a) - 1 # 更新頭指針
完整代碼詳見“Python算法之旅”知識(shí)星球。
(3)程序輸出效果圖如下,完整代碼詳見“Python算法之旅”知識(shí)星球。
課后作業(yè)
教材第一章的合并鏈表案例中,為鏈表生成了一個(gè)空的頭節(jié)點(diǎn),但本例中的程序并沒有創(chuàng)建空的頭節(jié)點(diǎn),而是直接把第一個(gè)有效節(jié)點(diǎn)作為頭節(jié)點(diǎn)了。如果增設(shè)一個(gè)空頭節(jié)點(diǎn)(可以為其數(shù)據(jù)域取值為-1),該如何編寫代碼?
需要本文word文檔、源代碼和課后思考答案的,可以加入“Python算法之旅”知識(shí)星球參與討論和下載文件,“Python算法之旅”知識(shí)星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。
我們專注Python算法,感興趣就一起來!
相關(guān)優(yōu)秀文章:
閱讀代碼和寫更好的代碼
最有效的學(xué)習(xí)方式
Python算法之旅文章分類
相關(guān)閱讀
-
世界熱推薦:今晚7:00直播丨下一個(gè)突破...
今晚19:00,Cocos視頻號(hào)直播馬上點(diǎn)擊【預(yù)約】啦↓↓↓在運(yùn)營了三年... -
NFT周刊|Magic Eden宣布支持Polygon網(wǎng)...
Block-986在NFT這樣的市場(chǎng),每周都會(huì)有相當(dāng)多項(xiàng)目起起伏伏。在過去... -
環(huán)球今亮點(diǎn)!頭條觀察 | DeFi的興衰與...
在比特幣得到機(jī)構(gòu)關(guān)注之后,許多財(cái)務(wù)專家預(yù)測(cè)世界將因?yàn)榧用茇泿诺?.. -
重新審視合作,體育Crypto的可靠關(guān)系才能雙贏
Block-987即使在體育Crypto領(lǐng)域,人們的目光仍然集中在FTX上。隨著... -
簡(jiǎn)訊:前端單元測(cè)試,更進(jìn)一步
前端測(cè)試@2022如果從2014年Jest的第一個(gè)版本發(fā)布開始計(jì)算,前端開發(fā)... -
焦點(diǎn)熱訊:劉強(qiáng)東這波操作秀
近日,劉強(qiáng)東發(fā)布京東全員信,信中提到:自2023年1月1日起,逐步為...