當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JavaScript数据结构与算法——链表详解(下)
生活随笔
收集整理的這篇文章主要介紹了
JavaScript数据结构与算法——链表详解(下)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在JavaScript數據結構與算法——鏈表詳解(上)中,我們探討了一下鏈表的定義、實現原理以及單鏈表的實現。接下來我們進一步了解一下鏈表的其他內容。
1、雙向鏈表
雙向鏈表實現原理圖:
與單向鏈表不同的是,圖中增加了小線部分,每一個節點增加了一個指向前驅節點的屬性,這樣就實現了雙向鏈表。
雙向鏈表中,刪除節點不需要知道待刪除節點的前驅節點,只要把待刪除節點指向前驅節點的屬性指向NULL,同時把前驅節點指向待刪除節點的后繼節點即可,這樣在刪除節點時更高效。結合原理圖比較好理解一點,雙向鏈表中,刪除節點原理如下圖:
增加節點原理如下圖:
2、JS實現雙向鏈表
以下代碼基于JavaScript數據結構與算法——鏈表詳解(上)中的代碼修改,文章末尾會附上完整代碼。
從原理圖可知,我們應該先給節點添加previous屬性,可通過修改Node類實現:
2.1、Node類修改
// Created by xiaoqiang on 24/04/2018. class Node {constructor (element) {this.element = elementthis.next = nullthis.previous = null} }2.2、LinkedList類修改
class LinkedList {constructor () {this.header = new Node('header') // 頭節點}// 查找元素find (item) {let currNode = this.headerwhile (currNode.element !== item) {currNode = currNode.next}return currNode}// 用于返回最后一個節點findLast () {let currNode = this.headerwhile (currNode.next !== null) {currNode = currNode.next}return currNode}// 插入節點insert (item, newElement) {let newNode = new Node(newElement)let current = this.find(item)newNode.next = current.nextnewNode.previous = currentcurrent.next = newNode}// 刪除節點remove (item) {let currNode = this.find(item)if (currNode.next !== null) {currNode.previous.next = currNode.nextcurrNode.next.previous = currNode.previouscurrNode.next = nullcurrNode.previous = null}}// 顯示鏈表display () {let currNode = this.headerwhile(currNode.next !== null) {console.log(currNode.next.element)currNode = currNode.next}}// 反向顯示鏈表displayReverse () {let currNode = this.headercurrNode = this.findLast()while (currNode.previous !== null) {console.log(currNode.element)currNode = currNode.previous}} }鏈表中的方法可根據需要添加。
2.3、測試實例修改:
let books = new LinkedList() console.log('開始插入操作') books.insert('header', 'JavaScript') books.insert('JavaScript', 'PHP') books.insert('PHP', 'Nodejs') console.log('插入后的鏈表數據為:') books.display() console.log('開始進行移除操作') books.remove('PHP') console.log('移除后PHP后的鏈表的數據為:') books.display() console.log('反向顯示鏈表:') books.displayReverse()2.3、雙向鏈表完整代碼
// Created by xiaoqiang on 24/04/2018. class Node {constructor (element) {this.element = elementthis.next = nullthis.previous = null} }class LinkedList {constructor () {this.header = new Node('header') // 頭節點}// 查找元素find (item) {let currNode = this.headerwhile (currNode.element !== item) {currNode = currNode.next}return currNode}// 用于返回最后一個節點findLast () {let currNode = this.headerwhile (currNode.next !== null) {currNode = currNode.next}return currNode}// 插入節點insert (item, newElement) {let newNode = new Node(newElement)let current = this.find(item)newNode.next = current.nextnewNode.previous = currentcurrent.next = newNode}// 刪除節點remove (item) {let currNode = this.find(item)if (currNode.next !== null) {currNode.previous.next = currNode.nextcurrNode.next.previous = currNode.previouscurrNode.next = nullcurrNode.previous = null}}// 顯示鏈表display () {let currNode = this.headerwhile(currNode.next !== null) {console.log(currNode.next.element)currNode = currNode.next}}// 反向顯示鏈表displayReverse () {let currNode = this.headercurrNode = this.findLast()while (currNode.previous !== null) {console.log(currNode.element)currNode = currNode.previous}} }let books = new LinkedList() console.log('開始插入操作') books.insert('header', 'JavaScript') books.insert('JavaScript', 'PHP') books.insert('PHP', 'Nodejs') console.log('插入后的鏈表數據為:') books.display() console.log('開始進行移除操作') books.remove('PHP') console.log('移除后PHP后的鏈表的數據為:') books.display() console.log('反向顯示鏈表:') books.displayReverse()2.4、運行及結果
使用node運行此js文件,結果如下:
3、循環鏈表
循環鏈表實現原理如下圖:
原理比雙向鏈表更簡單一些,有興趣可以嘗試實現一下,也可以給以上實現的鏈表類多添加一些方法,加深理解。
至此,JavaScript數據結構與算法——鏈表詳解(下)完結,有錯誤歡迎指出。
總結
以上是生活随笔為你收集整理的JavaScript数据结构与算法——链表详解(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript数据结构与算法——链
- 下一篇: gradle idea java ssm