激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

服務器之家 - 編程語言 - JavaScript - js教程 - JavaScript數(shù)據(jù)結(jié)構(gòu)之雙向鏈表

JavaScript數(shù)據(jù)結(jié)構(gòu)之雙向鏈表

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

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

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

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

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

JavaScript數(shù)據(jù)結(jié)構(gòu)之雙向鏈表

雙向鏈表實現(xiàn)

JavaScript 代碼實現(xiàn)雙向鏈表

?
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
// 創(chuàng)建雙向鏈表的構(gòu)造函數(shù)
function DoublyLinkedList() {
 // 創(chuàng)建節(jié)點構(gòu)造函數(shù)
 function Node(element) {
  this.element = element
  this.next = null
  this.prev = null // 新添加的
 }
 
 // 定義屬性
 this.length = 0
 this.head = null
 this.tail = null // 新添加的
 
 // 定義相關(guān)操作方法
 // 在尾部追加數(shù)據(jù)
 DoublyLinkedList.prototype.append = function (element) {
  // 1.根據(jù)元素創(chuàng)建節(jié)點
  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++
 }
 
 // 在任意位置插入數(shù)據(jù)
 DoublyLinkedList.prototype.insert = function (position, element) {
  // 1.判斷越界的問題
  if (position < 0 || position > this.length) return false
 
  // 2.創(chuàng)建新的節(jié)點
  var newNode = new Node(element)
 
  // 3.判斷插入的位置
  if (position === 0) { // 在第一個位置插入數(shù)據(jù)
   // 判斷鏈表是否為空
   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 { // 在中間位置插入數(shù)據(jù)
   // 定義屬性
   var index = 0
   var current = this.head
   var previous = null
 
   // 查找正確的位置
   while (index++ < position) {
    previous = current
    current = current.next
   }
 
   // 交換節(jié)點的指向順序
   newNode.next = current
   newNode.prev = previous
   current.prev = newNode
   previous.next = newNode
  }
 
  // 4.length+1
  this.length++
 
  return true
 }
 
 // 根據(jù)位置刪除對應的元素
 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
 }
 
 // 根據(jù)元素獲取在鏈表中的位置
 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
 }
 
 // 根據(jù)元素刪除
 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
 }
 
 // 遍歷方法的實現(xiàn)
 // 正向遍歷的方法
 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)
 }
 
 // 實現(xiàn)toString方法
 DoublyLinkedList.prototype.toString = function () {
  return this.forwardString()
 }
}

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

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

延伸 · 閱讀

精彩推薦
  • js教程JavaScript實現(xiàn)消消樂的源代碼

    JavaScript實現(xiàn)消消樂的源代碼

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

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

    詳解uniapp的全局變量實現(xiàn)方式

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

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

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

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

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

    原生JavaScript實現(xiàn)幻燈片效果

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

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

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

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

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

    原生js實現(xiàn)九宮格拖拽換位

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

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

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

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

    LuckyChou10352021-12-22
  • js教程js實現(xiàn)移動端輪播圖滑動切換

    js實現(xiàn)移動端輪播圖滑動切換

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

    浪漫前端11542021-12-15
主站蜘蛛池模板: 极品国产91在线网站 | 亚欧美一区二区 | 男女污视频在线观看 | 特一级黄色毛片 | 色诱亚洲精品久久久久久 | 永久av在线免费观看 | 久久精品无码一区二区三区 | 欧美日韩手机在线观看 | 成人男女啪啪免费观看网站四虎 | 麻豆视频在线观看免费网站 | 日本在线看 | 爱唯侦察 国产合集 亚洲 | 精品一区二区三区在线视频 | 免费在线观看毛片 | 精品国产一区二区三区免费 | 久久国产一 | 轻点插视频 | 日韩一级成人 | 亚洲人成网站免费播放 | 亚洲男人的天堂在线视频 | 91精品国产综合久久久动漫日韩 | 国产成人精品无人区一区 | 成人影片在线免费观看 | 91成人在线网站 | 久久精品视频免费 | 欧美精品久久久久久久久老牛影院 | 成人免费网站在线观看 | 成人网视频 | 成人在线视频免费看 | 国产69精品久久久久9999不卡免费 | 国产精品久久久久无码av | 牛牛碰在线 | 日本在线不卡一区二区 | 九九热在线精品视频 | 国产精品性夜天天视频 | 久久毛片免费观看 | 亚洲电影免费观看国语版 | 4480午夜 | 极品美女一级毛片 | 欧产日产国产精品v | 久草在线视频首页 |