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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[js] 请使用 js 实现一个双向链表

發布時間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [js] 请使用 js 实现一个双向链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[js] 請使用 js 實現一個雙向鏈表

鏈表結構是我們在面試中經常會被問起的較為基礎的數據結構問題,起初學習數據結構使用的是C++語言,最近在做前端面試題的過程中沒碰到了需要用js實現雙鏈表的需求,百度出來的文章發現可很多錯誤,于是索性自己重新寫了,并且列出了一些錯誤點,這里給大家較為詳細的一步步看一下實現思想和步驟,相較于C++語言,js的實現可以說是很簡單了,不需要創建繁瑣的對象,更加直觀易懂;
首先我們來看一下雙向鏈表的結構圖:
在這里插入圖片描述
每個結點包含三部分,指向前一個結點的指針(pre),指向后一個節點的指針(next),以及自己的數據部分(element),于是我們就可以先寫出結點對象

function Node:定義結點對象

function Node(element) {this.element = elementthis.next = nullthis.previous = null }

然后我們開始實現插入鏈表的算法
在這里插入圖片描述

(聲明)下面函數中的this是我們最后初始化鏈表的實例,這里大家不要疑惑。可以拉到最下面我們初始化鏈表那里,相信你會明白呦

**`function insert`:插入節點**function insert(newelement, currentelement) {var newNode = new Node(newelement)var currentNode = this.find(currentelement)if (currentNode === 'error') {console.log('無法插入,要插入節點不存在')return}if (currentNode.next != null) {newNode.next = currentNode.nextcurrentNode.next = newNodenewNode.previous = currentNodenewNode.next.previous = newNode} else {currentNode.next = newNodenewNode.previous = currentNode} }

function find:找到插入位置

function find(element) {var currentNode = this.headwhile (currentNode.element != element) {/*如果找到最后一個節點還沒有找到我們的插入點,那么我們就會返回錯誤*/if (currentNode.next == null) {console.log('can not find this node; maybe not have this node')return 'error'}currentNode = currentNode.next}return currentNode }

接下來是移除結點的實現,如果看懂了插入節點的實現,那么移除就會很簡單了,相信大家都可以很快明白,這里就直接貼出實現代碼;

function remove:移除一個結點function remove(element) {var currentNode = this.find(element)if (currentNode === 'error') {console.log('要移除節點不存在')return}/*首先是不是頭尾節點的情況*/if (currentNode.next != null && currentNode.previous != null) {currentNode.previous.next = currentNode.nextcurrentNode.next.previous = currentNode.previouscurrentNode.next = nullcurrentNode.previous = null} else if (currentNode.previous == null) {/*當是頭節點的時候*/this.head = currentNode.nextcurrentNode.next.previous = nullcurrentNode.next = null} else if (currentNode.next == null) {/*當是尾節點的時候 */currentNode.previous.next = nullcurrentNode.previous = null} }

截止到這里我們基本功能已經有了,下面使我們根據自己需要可以自定義一些其他函數

function lastNode:找到最后一個節點function lastNode() {var head = this.headwhile (head.next != null) {head = head.next}return head //這里head在尾節點的位置 } function append:將要添加的結點放在鏈表末尾function append(element) {var lastnode = this.lastNode()var newNode = new Node(element)lastnode.next = newNodenewNode.previous = lastnode } function showlist:將鏈表所有的結點打印出來function showlist() {var head = this.headdo {console.log(head.element)head = head.next} while (head != null)// 大家可以看一下下面注釋內容存在什么問題,留給大家思考一下// while (head.next != null) {// console.log(head.element)// head = head.next// } }

接下來是對鏈表進行初始化,這也是上述函數中所有this所代表的實例

function initlist:初始化鏈表,并將所有方法注冊到鏈表中

function initlist() {this.head = new Node('one')this.find = findthis.insert = insertthis.remove = removethis.showlist = showlistthis.lastNode = lastNodethis.append = append }var list = new initlist() list.insert('two', 'one') list.insert('four', 'two') list.insert('three', 'two')// console.log(list.head.next) list.showlist() list.append('A') list.append('B') list.insert('B2', 'B') list.showlist() console.log(list.lastNode()) // list.remove('one') // list.showlist() console.log(list.find('A').previous) // console.log(list.find('four').previous) // console.log(list.head.element)

下面是運行結果:
在這里插入圖片描述
源碼:

function Node(element) {this.element = elementthis.next = nullthis.previous = null } function find(element) {var currentNode = this.headwhile (currentNode.element != element) {if (currentNode.next == null) {console.log('can not find this node; maybe not have this node')return 'error'}currentNode = currentNode.next}return currentNode } function insert(newelement, currentelement) {var newNode = new Node(newelement)var currentNode = this.find(currentelement)if (currentNode === 'error') {console.log('無法插入,要插入節點不存在')return}if (currentNode.next != null) {newNode.next = currentNode.nextcurrentNode.next = newNodenewNode.previous = currentNodenewNode.next.previous = newNode} else {currentNode.next = newNodenewNode.previous = currentNode} } function remove(element) {var currentNode = this.find(element)if (currentNode === 'error') {console.log('要移除節點不存在')return}/*首先是不是頭尾節點的情況*/if (currentNode.next != null && currentNode.previous != null) {currentNode.previous.next = currentNode.nextcurrentNode.next.previous = currentNode.previouscurrentNode.next = nullcurrentNode.previous = null} else if (currentNode.previous == null) {/*當是頭節點的時候*/this.head = currentNode.nextcurrentNode.next.previous = nullcurrentNode.next = null} else if (currentNode.next == null) {/*當是尾節點的時候 */currentNode.previous.next = nullcurrentNode.previous = null} } function showlist() {var head = this.headdo {console.log(head.element)head = head.next} while (head != null)// while (head.next != null) {// console.log(head.element)// head = head.next// } } function initlist() {this.head = new Node('one')this.find = findthis.insert = insertthis.remove = removethis.showlist = showlistthis.lastNode = lastNodethis.append = append } function append(element) {var lastnode = this.lastNode()var newNode = new Node(element)lastnode.next = newNodenewNode.previous = lastnode } function lastNode() {var head = this.headwhile (head.next != null) {head = head.next}return head } var list = new initlist() list.insert('two', 'one') list.insert('four', 'two') list.insert('three', 'two')// console.log(list.head.next) list.showlist() list.append('A') list.append('B') list.insert('B2', 'B') list.showlist() console.log(list.lastNode()) // list.remove('one') // list.showlist() console.log(list.find('A').previous) // console.log(list.find('four').previous) // console.log(list.head.element)

個人簡介

我是歌謠,歡迎和大家一起交流前后端知識。放棄很容易,
但堅持一定很酷。歡迎大家一起討論

主目錄

與歌謠一起通關前端面試題

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的[js] 请使用 js 实现一个双向链表的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲欧洲无码一区二区三区 | 中文字幕理论片 | 成人刺激视频 | 国产污污视频在线观看 | 中文av免费 | 日韩大片免费在线观看 | 99久久精| 日本不卡一区二区在线观看 | 色婷婷成人网 | 校园春色欧美 | 韩国毛片基地 | 特大黑人巨交吊性xxxx视频 | 请用你的手指扰乱我吧 | 国产伦精品一区二区三区视频免费 | 日韩簧片在线观看 | 正在播放一区二区 | 美女啪啪av | 淫语视频 | 69xxx少妇按摩视频 | 日韩黄色成人 | 国精产品一区二区三区 | 亚洲精品日韩在线 | 精品人妻伦一二三区免费 | 亚洲天堂网在线观看 | 老头老夫妇自拍性tv | 男女一起插插插 | 女警白嫩翘臀呻吟迎合 | 国产精品一区二区入口九绯色 | 荒野求生21天去码版网站 | 国产精品人人人人 | 日韩一区二区三区高清 | 欧美性猛交xxxx乱 | 女人特黄大aaaaaa大片 | 色视频在线播放 | 国产91嫩草 | 91在线网| 亚洲成a人片在线www | 手机看片国产日韩 | av免费网站观看 | 天天射夜夜 | 国产精品a级 | 四虎视频国产精品免费入口 | 美女黄色一级 | 六月婷婷七月丁香 | 中文字幕一区二区三区免费看 | 美女脱裤子让男人捅 | 91视频久久久| 亚洲精品乱码久久久久 | 午夜精品福利一区二区 | 成人午夜福利视频 | 国产丝袜美腿一区二区三区 | 精品国产网站 | 日本一区二区三区在线观看视频 | 免费视频黄色 | 日韩免费黄色 | 亚洲精品88| 亚洲免费播放 | 日本网站免费观看 | 视频一区在线播放 | 国产福利视频一区 | 久久重口味 | 九九视频免费在线观看 | 日本三级中文字幕在线观看 | 少妇导航av | 最近最好的2019中文 | 97超在线 | 污污软件在线观看 | 狠狠撸在线视频 | 最新中文字幕视频 | 超碰1000 | 国产精品第六页 | 久一区二区三区 | 欧美成人影音 | 欧美午夜在线 | 国产一区二区黄色 | 久久99精品久久久久 | 日本一级片免费看 | 国产欧美自拍 | 国产精品国产三级国产专播品爱网 | 婷婷中文字幕 | 热逼视频 | 欧美激情性做爰免费视频 | 人人艹人人 | 一级一级黄色片 | a色网站 | 亚洲一区二区网站 | 淫辱的世界(调教sm)by | 欧美国产中文字幕 | 开心激情网站 | xxxxx在线观看 | 99国产免费 | 亚洲免费一二三区 | 久久国产色av免费观看 | 第一页在线 | 精品熟妇一区二区三区 | 亚洲字幕在线观看 | 国产毛片久久久久久国产毛片 | 色综合狠狠爱 | 天天天天操 |