網上的相關教程很是多,基礎知識自行搜索便可。javascript
習題主要選自Orelly出版的《數據結構與算法javascript描述》一書。java
參考代碼可見:https://github.com/dashnowords/blogs/tree/master/Structure/Listgit
特色:github
鏈表由節點組成,每一個節點增長一個對象的引用指向它的後繼節點。鏈表
也就是將一個線性錶轉換爲一個存儲空間上不連續,而在抽象層面可連續訪問的表。算法
用途:數據結構
更快的插入和刪除,由於只須要操做插入刪除位置相鄰元素便可,若是在線性表中,操做中間位置的元素後,後續的元素位置都須要調整。javascript中的應用例如原型鏈。指針
基本屬性code
element
當前節點的值next
下一個節點基本方法對象
insert(item, newitem)
在item後面插入一個新元素newitemblog
插入一個元素,須要將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()
方法,只顯示當前節點上的數據。n
個位置,在位置驗證合法時至關於,從原位置刪除一個節點,在新位置插入一個節點,爲操做方便直接使用雙向鏈表來實現便可。【注意點】:示例代碼中直接以放入鏈表的值爲依據進行節點查找,故不支持重複數據,可爲節點增長index
屬性來區分相同數據。與上一題原理一致
簡單,不作贅述。
使用一個單鏈表來存儲輸入的成績便可,當最後一個成績節點的指針指向null
便可。
用值爲1-40的元素循環鏈表來刪除節點直到總節點數目只剩2個爲止。爲了方便統計剩餘元素的數量,爲鏈表增長一個count
屬性來記錄元素個數。