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}
0 commit comments