Skip to content

Commit 9625473

Browse files
committed
update
1 parent 9d99cae commit 9625473

File tree

2 files changed

+119
-83
lines changed

2 files changed

+119
-83
lines changed

src/linked-list/DoublyLinkedList.js

Lines changed: 69 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const Comparator = require("../common/Comparator");
2+
13
/**
24
* 双向链表
35
*/
@@ -6,11 +8,12 @@ class DoublyLinkedList {
68
/**
79
* 构造函数
810
*/
9-
constructor() {
11+
constructor(fn = null) {
12+
this.comparator = new Comparator(fn);
1013
this.dummyHead = new DoublyLinkedListNode();
1114
this.dummyTail = new DoublyLinkedListNode();
12-
this.dummyHead.next = this.dummyTail;
13-
this.dummyTail.previous = this.dummyHead;
15+
this.dummyHead._next = this.dummyTail;
16+
this.dummyTail._previous = this.dummyHead;
1417
}
1518

1619

@@ -19,25 +22,34 @@ class DoublyLinkedList {
1922
*/
2023
length() {
2124
let length = 0
22-
let node = this.dummyHead.next;
25+
let node = this.dummyHead._next;
2326
while (node !== this.dummyTail) {
2427
length++;
2528
}
2629
return length;
2730
}
2831

2932
/**
30-
* 是否包含某个值
31-
* @param {*} value
33+
* find node's value equals value
34+
* @param {*} value value to found
35+
* @return {DoublyLinkedListNode} node founded
3236
*/
33-
contains(value) {
34-
let node = this.dummyHead.next;
37+
find(value) {
38+
let node = this.dummyHead._next;
3539
while (node !== this.dummyTail) {
36-
if (node.value === value) {
37-
return true;
40+
if (this.comparator.equal(node.value, value)) {
41+
return node;
3842
}
3943
}
40-
return false;
44+
return null;
45+
}
46+
47+
/**
48+
* 是否包含某个值
49+
* @param {*} value
50+
*/
51+
contains(value) {
52+
return find(value) !== null;
4153
}
4254

4355
/**
@@ -46,10 +58,10 @@ class DoublyLinkedList {
4658
*/
4759
prepend(value) {
4860
let newNode = new DoublyLinkedListNode(value);
49-
newNode.previous = this.dummyHead;
50-
newNode.next = this.dummyHead.next;
51-
this.dummyHead.next.previous = newNode;
52-
this.dummyHead.next = newNode;
61+
newNode._previous = this.dummyHead;
62+
newNode._next = this.dummyHead._next;
63+
this.dummyHead._next._previous = newNode;
64+
this.dummyHead._next = newNode;
5365
}
5466

5567
/**
@@ -58,10 +70,10 @@ class DoublyLinkedList {
5870
*/
5971
append(value) {
6072
let newNode = new DoublyLinkedListNode(value);
61-
newNode.previous = this.dummyTail.previous;
62-
newNode.next = this.dummyTail;
63-
this.dummyTail.previous.next = newNode;
64-
this.dummyTail.previous = newNode;
73+
newNode._previous = this.dummyTail._previous;
74+
newNode._next = this.dummyTail;
75+
this.dummyTail._previous._next = newNode;
76+
this.dummyTail._previous = newNode;
6577
}
6678

6779
/**
@@ -71,44 +83,44 @@ class DoublyLinkedList {
7183
*/
7284
insert(value, after) {
7385
let node = this.dummyHead;
74-
while (node.value !== after && node.next != this.dummyTail) {
75-
node = node.next;
86+
while (!this.comparator.equal(node.value, after) && node._next != this.dummyTail) {
87+
node = node._next;
7688
}
7789
let newNode = new DoublyLinkedListNode(value);
78-
newNode.next = node.next;
79-
newNode.previous = node;
80-
node.next.previous = newNode;
81-
node.next = newNode;
90+
newNode._next = node._next;
91+
newNode._previous = node;
92+
node._next._previous = newNode;
93+
node._next = newNode;
8294
}
8395

8496
/**
8597
* remove first node
8698
*/
8799
removeHead() {
88-
if (this.dummyHead.next !== this.dummyTail) {
89-
let remove = this.dummyHead.next;
90-
remove.previous.next = remove.next;
91-
remove.next.previous = remove.previous;
100+
if (this.dummyHead._next !== this.dummyTail) {
101+
let remove = this.dummyHead._next;
102+
remove._previous._next = remove._next;
103+
remove._next._previous = remove._previous;
92104

93105
// NOTE: for memory leak
94106
remove.value = null;
95-
remove.previous = null;
96-
remove.next = null;
107+
remove._previous = null;
108+
remove._next = null;
97109
}
98110
}
99111

100112
/**
101113
* remove last node
102114
*/
103115
removeTail() {
104-
if (this.dummyTail.previous !== this.dummyHead) {
105-
let remove = this.dummyTail.previous;
106-
remove.previous.next = remove.next;
107-
remove.next.previous = remove.previous;
116+
if (this.dummyTail._previous !== this.dummyHead) {
117+
let remove = this.dummyTail._previous;
118+
remove._previous._next = remove._next;
119+
remove._next._previous = remove._previous;
108120
// NOTE: for memory leak
109121
remove.value = null;
110-
remove.previous = null;
111-
remove.next = null;
122+
remove._previous = null;
123+
remove._next = null;
112124
}
113125
}
114126

@@ -117,16 +129,16 @@ class DoublyLinkedList {
117129
* @param {*} value
118130
*/
119131
remove(value) {
120-
let node = this.dummyHead.next;
132+
let node = this.dummyHead._next;
121133
while (node !== this.dummyTail) {
122-
let next = node.next;
123-
if (node.value === value) {
124-
node.previous.next = node.next;
125-
node.next.previous = node.previous;
134+
let next = node._next;
135+
if (this.comparator.equal(node.value, value)) {
136+
node._previous._next = node._next;
137+
node._next._previous = node._previous;
126138
// NOTE: for memory leak
127139
node.value = null;
128-
node.previous = null;
129-
node.next = null;
140+
node._previous = null;
141+
node._next = null;
130142
}
131143
node = next;
132144
}
@@ -137,10 +149,10 @@ class DoublyLinkedList {
137149
*/
138150
toArray() {
139151
let array = new Array();
140-
let node = this.dummyHead.next;
152+
let node = this.dummyHead._next;
141153
while (node != this.dummyTail) {
142154
array.push(node.value);
143-
node = node.next;
155+
node = node._next;
144156
}
145157
return array;
146158
}
@@ -156,9 +168,18 @@ class DoublyLinkedListNode {
156168
* @param {*} value
157169
*/
158170
constructor(value) {
171+
/**
172+
* @type {*}
173+
*/
159174
this.value = value;
160-
this.previous = null;
161-
this.next = null;
175+
/**
176+
* @type {DoublyLinkedListNode}
177+
*/
178+
this._previous = null;
179+
/**
180+
* @type {DoublyLinkedListNode}
181+
*/
182+
this._next = null;
162183
}
163184

164185
}

src/linked-list/LinkedList.js

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const Comparator = require("../common/Comparator");
2+
13
/**
24
* LinkedListNode
35
*/
@@ -9,7 +11,10 @@ class LinkedListNode {
911
*/
1012
constructor(value) {
1113
this.value = value;
12-
this.next = null;
14+
/**
15+
* @type {LinkedListNode}
16+
*/
17+
this._next = null;
1318
}
1419
}
1520

@@ -21,30 +26,40 @@ class LinkedList {
2126
/**
2227
* LinkedList 构造
2328
*/
24-
constructor() {
29+
constructor(fn = null) {
30+
this.comparator = new Comparator(fn);
2531
this.dummyHead = new LinkedListNode();
2632
}
2733

2834
/**
29-
* 链表中是否存在某个值
30-
* @param {*} value
35+
* find node's value equals value
36+
* @param {*} value value to found
37+
* @return {LinkedListNode} node founded
3138
*/
32-
contains(value) {
33-
let node = this.dummyHead.next;
39+
find(value) {
40+
let node = this.dummyHead._next;
3441
while (node) {
35-
if (node.value === value) {
36-
return true;
42+
if (this.comparator.equal(node.value, value)) {
43+
return node;
3744
}
3845
}
39-
return false;
46+
return null;
47+
}
48+
49+
/**
50+
* 链表中是否存在某个值
51+
* @param {*} value
52+
*/
53+
contains(value) {
54+
return find(value) !== null;
4055
}
4156

4257
/**
4358
* 计算链表长度
4459
*/
4560
length() {
4661
let length = 0;
47-
let node = this.dummyHead.next;
62+
let node = this.dummyHead._next;
4863
while (node) {
4964
length++;
5065
}
@@ -57,8 +72,8 @@ class LinkedList {
5772
*/
5873
prepend(value) {
5974
let newNode = new LinkedListNode(value);
60-
newNode.next = this.dummyHead.next;
61-
this.dummyHead.next = newNode;
75+
newNode._next = this.dummyHead._next;
76+
this.dummyHead._next = newNode;
6277
}
6378

6479
/**
@@ -67,10 +82,10 @@ class LinkedList {
6782
*/
6883
append(value) {
6984
let node = this.dummyHead;
70-
while (node.next) {
71-
node = node.next;
85+
while (node._next) {
86+
node = node._next;
7287
}
73-
node.next = new LinkedListNode(value);
88+
node._next = new LinkedListNode(value);
7489
}
7590

7691
/**
@@ -80,24 +95,24 @@ class LinkedList {
8095
*/
8196
insert(value, after) {
8297
let node = this.dummyHead;
83-
while (node.value !== after && node.next) {
84-
node = node.next;
98+
while (!this.comparator.equal(node.value, after) && node._next) {
99+
node = node._next;
85100
}
86101
let newNode = new LinkedListNode(value);
87-
newNode.next = node.next;
88-
node.next = newNode;
102+
newNode._next = node._next;
103+
node._next = newNode;
89104
}
90105

91106
/**
92107
* remove first node
93108
*/
94109
removeHead() {
95-
if (this.dummyHead.next) {
96-
let remove = this.dummyHead.next;
97-
this.dummyHead.next = remove.next;
110+
if (this.dummyHead._next) {
111+
let remove = this.dummyHead._next;
112+
this.dummyHead._next = remove._next;
98113
// NOTE: for memory leak
99114
remove.value = null;
100-
remove.next = null;
115+
remove._next = null;
101116
}
102117
}
103118

@@ -107,15 +122,15 @@ class LinkedList {
107122
removeTail() {
108123
let node = this.dummyHead;
109124
let pre = null;
110-
while (node.next) {
125+
while (node._next) {
111126
pre = node;
112-
node = node.next;
127+
node = node._next;
113128
}
114129
if (pre) {
115-
pre.next = null;
130+
pre._next = null;
116131
// NOTE: for memory leak
117132
node.value = null;
118-
node.next = null;
133+
node._next = null;
119134
}
120135
}
121136

@@ -125,16 +140,16 @@ class LinkedList {
125140
*/
126141
remove(value) {
127142
let pre = this.dummyHead;
128-
let node = pre.next;
143+
let node = pre._next;
129144
while (node) {
130-
if (node.value === value) {
131-
pre.next = node.next;
132-
node.next = null;
145+
if (this.comparator.equal(node.value, value)) {
146+
pre._next = node._next;
147+
node._next = null;
133148
node.value = null;
134149
} else {
135-
pre = pre.next;
150+
pre = pre._next;
136151
}
137-
node = (pre ? pre.next : null);
152+
node = (pre ? pre._next : null);
138153
}
139154
}
140155

@@ -143,10 +158,10 @@ class LinkedList {
143158
*/
144159
toArray() {
145160
let array = new Array();
146-
let node = this.dummyHead.next;
161+
let node = this.dummyHead._next;
147162
while (node) {
148163
array.push(node.value);
149-
node = node.next;
164+
node = node._next;
150165
}
151166
return array;
152167
}

0 commit comments

Comments
 (0)