網上的相關教程非常多,基礎知識自行搜索即可。 習題主要選自Orelly出版的《數據結構與演算法javascript描述》一書。 參考代碼可見: "https://github.com/dashnowords/blogs/tree/master/Structure/List" 鏈表的基本知識 特點: 鏈 ...
網上的相關教程非常多,基礎知識自行搜索即可。
習題主要選自Orelly出版的《數據結構與演算法javascript描述》一書。
參考代碼可見:https://github.com/dashnowords/blogs/tree/master/Structure/List
鏈表的基本知識
特點:
鏈表由節點組成,每個節點增加一個對象的引用指向它的後繼節點。
鏈表
也就是將一個線性表轉換為一個存儲空間上不連續,而在抽象層面可連續訪問的表。用途:
更快的插入和刪除,因為只需要操作插入刪除位置相鄰元素即可,如果線上性表中,操作中間位置的元素後,後續的元素位置都需要調整。javascript中的應用例如原型鏈。
基本屬性
element
當前節點的值next
下一個節點
基本方法
insert(item, newitem)
在item後面插入一個新元素newitem插入一個元素,需要將item元素節點的
next
指向新元素,新元素的next
指向item元素的後繼元素。remove(pos)
從隊頭刪除一個元素刪除一個節點時,需要將其前驅節點的
next
指向其後繼節點即可。find(element)
查詢值為element的節點位置findpre(element)
查詢值為element的節點的前一個節點display()
顯示整個鏈表
基本練習
根據鏈表的基本特性實現一個
LinkedList
類,併在後續題目中需要用鏈表時使用它。【註意點】:刪除指定元素時,由於需要修改指定元素前一個節點的
next
指針,所以當所查找的節點存在時,搜索方法應當返回其前一個節點以供後續步驟使用。實現一個雙向鏈表
TwoWayLinkedList
類。【註意點】:每一個實例會記錄前驅節點和後繼節點,雙向鏈表比單鏈表增加了反向遍歷的能力,並且由於所查找節點的屬性中包含了前驅和後繼節點的信息,故插入節點和刪除節點時使用同一個搜索方法即可。
以
LinkedList
類為參考基準,實現一個迴圈鏈表CircularLinkedList
類。【註意點】:迴圈鏈表的特點是尾節點的next指針指向了頭節點。
課後習題(書中第六節習題)
- 實現
Advance(n)
方法,使節點向前移動n個節點。 - 實現
back(n)
方法,使節點向後移動n個節點。 - 實現
show()
方法,只顯示當前節點上的數據。 - (略)
- (略)
- 傳說在公元1世紀猶太戰爭中,猶太歷史學家弗拉維奧·約瑟夫斯和他的40個同胞被羅馬士兵包圍,猶太士兵決定寧可自殺也不做俘虜,於是商量出一個自殺方案。他們圍成一個圈,從一個人開始,數到第三個人事將第三個人殺死,然後再數,直到殺光所有人,約瑟夫和另一個人決定不參加這個瘋狂的游戲,他們快速地計算出兩個位置,站在那裡得以幸存。寫一段將n個人圍成一圈,並且第m個人會被殺掉,計算一圈中哪兩個人最後會存貨,使用迴圈鏈表解決該問題。
習題思路
- 向前移動
n
個位置,在位置驗證合法時相當於,從原位置刪除一個節點,在新位置插入一個節點,為操作方便直接使用雙向鏈表來實現即可。【註意點】:示例代碼中直接以放入鏈表的值為依據進行節點查找,故不支持重覆數據,可為節點增加index
屬性來區分相同數據。
與上一題原理一致
簡單,不做贅述。
使用一個單鏈表來存儲輸入的成績即可,當最後一個成績節點的指針指向
null
即可。用值為1-40的元素迴圈鏈表來刪除節點直到總節點數目只剩2個為止。為了方便統計剩餘元素的數量,為鏈表增加一個
count
屬性來記錄元素個數。