-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdoublyLinkedList.js
147 lines (122 loc) · 3 KB
/
doublyLinkedList.js
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
// 双向链表
function DoublyLinkedList () {
var Node = function (element) {
this.element = element
this.prev = null // 新增了一个指向前一个元素的引用
this.next = null
}
var length = 0
var head = null
var tail = null //新增了tail指向最后一个元素
this.insert = function (position, element) {
// 检查是否越界
if (position >= 0 && position <= length) {
var node = new Node(element),
current = head,
previous,
index = 0
if (position === 0) { // 第一个元素的之前插入
// 如果链表为空
if (!head) {
head = node
tail = node
} else {
node.next = current
current.prev = node
head = node
}
} else if (position === length) { // 在最后一个元素之后插入
current = tail
node.prev = current
current.next = node
tail = node
} else { // 在中间插入
while (index++ < position) {
previous = current
current = current.next
}
node.next = current
previous.next = node
current.prev = node
node.prev = previous
}
length++
return true
} else {
return false
}
}
this.removeAt = function (position) {
// 检查是否越界
if (position > -1 && position < length) {
var current = head,
previous,
index = 0
if (position === 0) { // 第一个元素
head = current.next
// 如果只有一个元素
if (length === 1) {
tail = null
} else {
head.prev = null
}
} else if (position === length - 1) { // 最后一个元素
current = tail
tail = current.prev
tail.next = null
} else {
while (index++ < position) {
previous = current
current = current.next
}
previous.next = current.next
current.next.prev = previous
}
length--
return current.element
} else {
return null
}
}
this.append = function (element) {
var node = new Node(element),
current = tail
if (head === null) {
head = node
tail = node
} else {
node.prev = current
current.next = node
tail = node
}
length++
}
this.toString = function () {
var current = head,
string = ''
while (current) {
string += current.element
current = current.next
}
return string
}
// 链表首元素
this.showHead = function() {
return head;
};
// 链表长度
this.showLength = function() {
return length;
};
// 链表尾元素
this.showTail = function() {
return tail;
}
}
// 一些操作
// var doublylinkedlist = new DoublyLinkedList()
// doublylinkedlist.append(1)
// doublylinkedlist.append(2)
// doublylinkedlist.insert(2, 3)
// doublylinkedlist.append(445)
// console.log(doublylinkedlist.toString())