摘要:一般我們都構造雙向循環鏈表。循環鏈表的操作和單鏈表的操作基本一致,差別僅僅在于算法中的循環條件有所不同。單向循環鏈表雙向循環鏈表單向循環鏈表是在單鏈表基礎上,將最后一個節點的指針指向鏈表頭。
維基百科
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接后繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點。一般我們都構造雙向循環鏈表。
又上面可知,雙向鏈表與單鏈表的區別在于,雙向鏈表的每個節點都有一個指向前一個的指針(previous)。
想了解單鏈表,可以看看我上一遍寫的單鏈表。
1.先創建節點的類。
class Node { constructor (element) { this.elememt = element; this.previous = null; // 這個是指向前一個的指針。 this.next = null; } }
2.再創建雙向鏈表的類。
class DoubleLinkedList { constructor () { this.head = null; this.length = 0; } }
接下來給雙向聯表添加一些方法(一下方法都是在雙向鏈表類里面寫的)。
Append
/** * * @param element 用來實例節點的數據,什么數據類型都行. */ append (element) { let node = new Node(element), current; if (!this.length) { // 長度為0,則是新的鏈表。 this.head = node; // 鏈表的頭指向新的node。 } else { current = this.head; // current獲得指向第一個節點的指針。 while (current.next) { // 當前node.next存在。 current = current.next; // 如果當前節點(current)的next不為null,那么current.next這個指針就給了current。 } // current的下一個為null的時候,退出循環。 current.next = node; // current.next為null退出循環(即已到了最后一個節點),那么它的next為node node.previous = current; // 新加入的node的前一個就是current。 } this.length++; // 長度加一,別忘咯。 console.log("Append successfully!"); }
InsertNode
/** * @param element * @param {Number} position 要插入的某個位置. */ insertNode (element, position) { if (position >= 0 && position <= this.length) { let node = new Node(element), front, index = 0, current = this.head; if (!position) { // 如果插入的位置為 0 。 this.head = node; node.next = current; // node的后一個是之前head所指的,即是current。 } else { while (index++ < position) { front = current; // 當前變為前一個。 current = current.next; // 下一個就變為當前 } front.next = current.previous = node; // 前一個的next 和 當前的previous 是node。 node.previous = front; // 插入的node的前一個為front。 node.next = current; // 插入的node的后一個是current。 } this.length++; console.log("Insert successfully!"); } else { throw new Error("插入的位置有誤啊!"); } }
RemoveNode
/** * @param {Number} position */ removeNode (position) { if (position > -1 && position < this.length) { let current = this.head, front, index = 0; if (!position) { // 位置為 0 。 this.head = current.next; current.next.previous = this.previous; } else { while (index++ < position) { front = current; current = current.next; } if (current.next) { // 這里判斷當前node的下一個是否為 null。(例如要刪除最后一個是node.next是null的) current.next.previous = front; // 當前node的下一個的previous為front。(有點繞口) } front.next = current.next; // 前一個的下一個為current的下一個。 (...繞口) } this.length--; console.log("Remove successfully!"); } else { throw new Error("移除的位置有誤啊!"); } }
print () { let arr = [this.head]; let node = this.head; while (node.next) { node = node.next; arr.push(node); } arr.map( (x, index) => console.log(`第${index + 1}個節點是`, x)); }附上個人源碼
循環鏈表 ----(維基百科)
循環鏈表是一種鏈式存儲結構,它的最后一個結點指向頭結點,形成一個環。因此,從循環鏈表中的任何一個結點出發都能找到任何其他結點。循環鏈表的操作和單鏈表的操作基本一致,差別僅僅在于算法中的循環條件有所不同。
1.單向循環鏈表
2.雙向循環鏈表
單向循環鏈表是在單鏈表基礎上,將最后一個節點的next指針指向鏈表頭(head)。
雙向循環鏈表是在雙向鏈表基礎上,將最后一個節點的next指針指向鏈表頭(head)。
就寫到這里咯。你問我怎么不實現循環鏈表?這個就...你們實現吧,程序猿嘛,要多動手,多動手。
謝謝大家。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90191.html
摘要:什么是雙鏈表上一篇實戰數據結構基礎之單鏈表說到單鏈表由一個一個的作為節點的對象構成的,每一個節點都有指向下一個節點的指針,最后一個節點的指針域指向空。 什么是雙鏈表? 上一篇實戰PHP數據結構基礎之單鏈表說到 單鏈表由一個一個的作為節點的對象構成的,每一個節點都有指向下一個節點的指針,最后一個節點的指針域指向空。每個節點可以存儲任何數據類型。 而雙鏈表每個節點有兩個指針域,分別指向前驅...
面試舊敵之紅黑樹(直白介紹深入理解) - Android - 掘金 讀完本文你將了解到: 什么是紅黑樹 黑色高度 紅黑樹的 5 個特性 紅黑樹的左旋右旋 指定節點 x 的左旋 右圖轉成左圖 指定節點 y 的右旋左圖轉成右圖 紅黑樹的平衡插入 二叉查找樹的插入 插入后調整紅黑樹結構 調整思想 插入染紅后... java 多線程同步以及線程間通信詳解 & 消費者生產者模式 & 死鎖 & Thread...
摘要:一個單向鏈表包含兩個值當前節點的值和一個指向下一個節點的鏈接。為退出循環即已到了最后一個節點那么它的為加入節點后,要把單鏈表長度加一。第個節點是運行結果個人源碼地址單鏈表就寫到這里咯,接下來還會寫其他的數據結構本人也在學習當中。 維基百科 鏈表是一種常見的基礎數據結構,是一種線性表,但是并不會按線性的順序存儲數據,而是在每一個節點里存到下一個節點的指針。 鏈表中最簡單的一種是單向鏈...
摘要:關于遞歸這里提一兩點遞歸基本有這幾步遞歸的模板,終止條件,遞歸調用,邏輯處理。 ?作者簡介:大家好,我是車神哥,府學路18號的車神? ?個人主頁:應無所住而生...
閱讀 2977·2023-04-25 17:22
閱讀 1542·2019-08-30 15:54
閱讀 1270·2019-08-30 15:53
閱讀 1787·2019-08-30 15:43
閱讀 3020·2019-08-29 12:29
閱讀 1232·2019-08-26 11:37
閱讀 3255·2019-08-23 18:02
閱讀 1604·2019-08-23 14:15