一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - JavaScript數據結構之雙向鏈表

JavaScript數據結構之雙向鏈表

2022-02-13 17:19希魔王的塔羅牌 js教程

這篇文章主要為大家詳細介紹了JavaScript數據結構之雙向鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

單向鏈表在遍歷時只能從頭到尾或者從尾遍歷到頭;所以單向鏈表可以輕松到達下一節點,但是回到上一個節點是很困難的

而雙向鏈表既可以從頭遍歷到尾, 又可以從尾遍歷到頭,鏈表的相聯是雙向的,一個節點既有向前連接的引用,也有向后連接的引用

但是正因如此,雙向鏈表在插入或者刪除某個節點時,需要處理四個節點的引用,并且所占用內存空間也更大一些

JavaScript數據結構之雙向鏈表

雙向鏈表實現

JavaScript 代碼實現雙向鏈表

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
// 創建雙向鏈表的構造函數
function DoublyLinkedList() {
 // 創建節點構造函數
 function Node(element) {
  this.element = element
  this.next = null
  this.prev = null // 新添加的
 }
 
 // 定義屬性
 this.length = 0
 this.head = null
 this.tail = null // 新添加的
 
 // 定義相關操作方法
 // 在尾部追加數據
 DoublyLinkedList.prototype.append = function (element) {
  // 1.根據元素創建節點
  var newNode = new Node(element)
 
  // 2.判斷列表是否為空列表
  if (this.head == null) {
   this.head = newNode
   this.tail = newNode
  } else {
   this.tail.next = newNode
   newNode.prev = this.tail
   this.tail = newNode
  }
 
  // 3.length+1
  this.length++
 }
 
 // 在任意位置插入數據
 DoublyLinkedList.prototype.insert = function (position, element) {
  // 1.判斷越界的問題
  if (position < 0 || position > this.length) return false
 
  // 2.創建新的節點
  var newNode = new Node(element)
 
  // 3.判斷插入的位置
  if (position === 0) { // 在第一個位置插入數據
   // 判斷鏈表是否為空
   if (this.head == null) {
    this.head = newNode
    this.tail = newNode
   } else {
    this.head.prev = newNode
    newNode.next = this.head
    this.head = newNode
   }
  } else if (position === this.length) { // 插入到最后的情況
   // 思考: 這種情況是否需要判斷鏈表為空的情況呢? 答案是不需要, 為什么?
   this.tail.next = newNode
   newNode.prev = this.tail
   this.tail = newNode
  } else { // 在中間位置插入數據
   // 定義屬性
   var index = 0
   var current = this.head
   var previous = null
 
   // 查找正確的位置
   while (index++ < position) {
    previous = current
    current = current.next
   }
 
   // 交換節點的指向順序
   newNode.next = current
   newNode.prev = previous
   current.prev = newNode
   previous.next = newNode
  }
 
  // 4.length+1
  this.length++
 
  return true
 }
 
 // 根據位置刪除對應的元素
 DoublyLinkedList.prototype.removeAt = function (position) {
  // 1.判斷越界的問題
  if (position < 0 || position >= this.length) return null
 
  // 2.判斷移除的位置
  var current = this.head
  if (position === 0) {
   if (this.length == 1) {
    this.head = null
    this.tail = null
   } else {
    this.head = this.head.next
    this.head.prev = null
   }
  } else if (position === this.length -1) {
   current = this.tail
   this.tail = this.tail.prev
   this.tail.next = null
  } else {
   var index = 0
   var previous = null
 
   while (index++ < position) {
    previous = current
    current = current.next
   }
 
   previous.next = current.next
   current.next.prev = previous
  }
 
  // 3.length-1
  this.length--
 
  return current.element
 }
 
 // 根據元素獲取在鏈表中的位置
 DoublyLinkedList.prototype.indexOf = function (element) {
  // 1.定義變量保存信息
  var current = this.head
  var index = 0
 
  // 2.查找正確的信息
  while (current) {
   if (current.element === element) {
    return index
   }
   index++
   current = current.next
  }
 
  // 3.來到這個位置, 說明沒有找到, 則返回-1
  return -1
 }
 
 // 根據元素刪除
 DoublyLinkedList.prototype.remove = function (element) {
  var index = this.indexOf(element)
  return this.removeAt(index)
 }
 
 // 判斷是否為空
 DoublyLinkedList.prototype.isEmpty = function () {
  return this.length === 0
 }
 
 // 獲取鏈表長度
 DoublyLinkedList.prototype.size = function () {
  return this.length
 }
 
 // 獲取第一個元素
 DoublyLinkedList.prototype.getHead = function () {
  return this.head.element
 }
 
 // 獲取最后一個元素
 DoublyLinkedList.prototype.getTail = function () {
  return this.tail.element
 }
 
 // 遍歷方法的實現
 // 正向遍歷的方法
 DoublyLinkedList.prototype.forwardString = function () {
  var current = this.head
  var forwardStr = ""
 
  while (current) {
   forwardStr += "," + current.element
   current = current.next
  }
 
  return forwardStr.slice(1)
 }
 
 // 反向遍歷的方法
 DoublyLinkedList.prototype.reverseString = function () {
  var current = this.tail
  var reverseStr = ""
 
  while (current) {
   reverseStr += "," + current.element
   current = current.prev
  }
 
  return reverseStr.slice(1)
 }
 
 // 實現toString方法
 DoublyLinkedList.prototype.toString = function () {
  return this.forwardString()
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/Nozomi0609/article/details/114385562

延伸 · 閱讀

精彩推薦
  • js教程JavaScript實現消消樂的源代碼

    JavaScript實現消消樂的源代碼

    這篇文章主要介紹了JavaScript實現消消樂-源代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以...

    代碼100分12182021-12-30
  • js教程詳解uniapp的全局變量實現方式

    詳解uniapp的全局變量實現方式

    這篇文章主要介紹了詳解uniapp的全局變量實現方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    繭君11012021-12-29
  • js教程微信小程序 接入騰訊地圖的兩種寫法

    微信小程序 接入騰訊地圖的兩種寫法

    這篇文章主要介紹了微信小程序 接入騰訊地圖的兩種寫法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參...

    木早長泉8852021-12-30
  • js教程原生JavaScript實現幻燈片效果

    原生JavaScript實現幻燈片效果

    這篇文章主要為大家詳細介紹了原生JavaScript實現幻燈片效果,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    清水拌墨茶4792022-01-21
  • js教程繪制微信小程序驗證碼功能的實例代碼

    繪制微信小程序驗證碼功能的實例代碼

    這篇文章主要介紹了繪制微信小程序驗證碼功能的實例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參...

    WALL*E8852021-12-27
  • js教程原生js實現九宮格拖拽換位

    原生js實現九宮格拖拽換位

    這篇文章主要為大家詳細介紹了原生js實現九宮格拖拽換位,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    _小木不是木_11992022-01-07
  • js教程JavaScript 防盜鏈的原理以及破解方法

    JavaScript 防盜鏈的原理以及破解方法

    這篇文章主要介紹了JavaScript 防盜鏈的原理以及破解方法,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下...

    LuckyChou10352021-12-22
  • js教程js實現移動端輪播圖滑動切換

    js實現移動端輪播圖滑動切換

    這篇文章主要為大家詳細介紹了js實現移動端輪播圖滑動切換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    浪漫前端11542021-12-15
主站蜘蛛池模板: 激情视频在线播放 | 国语刺激对白勾搭视频在线观看 | 91果冻制片厂天美传媒 | 四虎最新永久在线精品免费 | 日本九九热 | 国产女乱淫真高清免费视频 | 美女女女女女女bbbbbb毛片 | 1024国产高清精品推荐 | 四虎影视紧急入口地址大全 | 日本艳鉧动漫1~6完整版在 | 四虎在线免费 | 红色一片在线影视 | 久久精品动漫99精品动漫 | 精灵之森高清在线 | blacked黑人hd2021 bestialityvideo另类 | 精品一区二区三区免费观看 | 日本xxxxx高清免费观看 | 亚洲国产精品久久精品成人网站 | 91国内精品线免费播放 | 成人午夜影院在线观看 | 无码射肉在线播放视频 | 韩国美女激情vip | 国产免费看黄的私人影院 | 男同gay作爰视频网站 | 69短视频 | 999精品视频在线观看 | 91嫩草私人成人亚洲影院 | 日韩欧美在线观看综合网另类 | 色综合久久中文字幕综合网 | 国产一卡二卡3卡4卡四卡在线视频 | 性bbbbwwbbbb | 国产精品一级视频 | 日韩 视频在线播放 | 国产东北3p真实在线456视频 | 暖暖中国免费观看高清完整版 | 色综合视频在线 | 性欧美金发洋妞xxxxbbbb | 亚洲天堂影院在线观看 | 日本视频二区 | 好湿好紧太硬了我太爽了网站 | 国产极品精频在线观看 |