日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript数据结构与算法——链表详解(下)

發布時間:2023/12/31 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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数据结构与算法——链表详解(下)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。