-
Notifications
You must be signed in to change notification settings - Fork 0
/
21. 0.链表实现.js
164 lines (159 loc) · 3.99 KB
/
21. 0.链表实现.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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/**
* @description
* 数组的特点:
线性结构,顺序存储
插入慢,查找快
时间复杂度:查找O(1)、更新O(1)、插入O(n)、删除O(n)
* 链表的特点:
线性结构,随机存储(省内存)
插入快,查找慢
时间复杂度:查找O(n)、更新O(1)、插入O(1)、删除O(1)
*/
/**
* @description
* 链表提供以下方法:
* 1、 push(element) // 链表尾部插入节点
2、 pop() // 链表尾部删除节点
3、 shift() // 删除头部节点、
4、 unshift(element) // 插入头部节点
5、 find(index) // 查找指定位置节点
6、 insert(element, index) // 指定位置插入节点
7、 update(element, index) // 修改指定位置节点
8、 delete(index) // 链表删除指定位置节点
9、 cycle(index) // 使链表尾指向某节点成环
*/
function initList() {
class Node {
constructor(value) {
this.element = value
this.next = null
}
}
class List {
/**
* 链表的基本属性:head、last、size
* */
constructor() {
this.head = null
this.last = null
this.size = 0
}
/** 方法 */
// 尾部插入
push(element) {
let node = new Node(element)
if (this.size === 0) {
this.head = this.last = node
} else {
this.last = this.last.next = node
}
++this.size
}
// 尾部删除
pop() {
if (this.size <= 1) {
this.head = this.last = null
this.size = 0
} else {
let prev = this.head, i = 1
while (++i < this.size) {
prev = prev.next
}
prev.next = null
this.last = prev
this.size--
}
}
// 头部删除
shift() {
if (this.size <= 1) {
this.head = this.last = null
this.size = 0
} else {
this.head = this.head.next
this.size--
}
}
// 头部插入
unshift(element) {
const prevHead = this.head
this.head = new Node(element)
this.head.next = prevHead
if (this.size === 0) {
this.last = this.head
}
this.size++
}
// 查找指定位置节点
find(index) {
if (index < 0 || index > this.size) {
console.error('超出链表节点范围')
return false
} else {
let i = 0, cur = this.head
while (i++ < index) {
cur = cur.next
}
return cur
}
}
// 指定位置插入节点
insert(element, index) {
if (index < 0 || index > this.size) {
console.error('超出链表节点范围')
return false
} else if (index === 0) {
this.unshift(element)
} else if (index === this.size) {
this.push(element)
} else {
let prev = this.find(index - 1),
cur = this.find(index)
prev.next = new Node(element)
prev.next.next = cur
this.size++
}
}
// 修改指定位置节点
update(element, index) {
this.find(index).element = element
}
// 链表删除指定位置节点
delete(index) {
if (index < 0 || index > this.size) {
console.error('超出链表节点范围')
} else if (index === 0) {
this.shift()
} else if (index === this.size) {
this.pop()
} else {
this.find(index - 1).next = this.find(index + 1)
this.size--
}
}
// 使链表尾指向index节点成环
cycle(index) {
if (index < 0 || index >= this.size) {
console.error('该位置无法成环!')
return false
} else {
this.last.next = this.find(index)
}
}
}
return new List()
}
// let list = initList()
// list.push(222)
// list.push(333)
// list.push(444)
// list.pop()
// list.shift()
// list.unshift(111)
// list.find(2)
// list.insert(111, 0)
// list.update('a', 1)
// list.delete(1)
// list.cycle(1)
// console.log(new Date().getTime(), list)
export { initList }