@@ -38,108 +38,52 @@ class DoublyLinkedList {
38
38
}
39
39
40
40
setHead ( node ) {
41
- const next = this . head ;
42
- if ( node . next ) node . next . prev = node . prev ;
43
- if ( node . prev ) node . prev . next = node . next ;
44
- this . head . prev = node ;
45
- this . head = node ;
46
- this . head . prev = null ;
47
- this . head . next = next ;
41
+ this . insertBefore ( this . head , node ) ;
48
42
}
49
43
50
44
setTail ( node ) {
51
- const prev = this . tail ;
52
-
53
- if ( node . prev ) node . prev . next = node . next ;
54
- if ( node . next ) node . next . prev = node . prev ;
55
- this . tail . next = node ;
56
- this . tail = node ;
57
- this . tail . next = null ;
58
- this . tail . prev = prev ;
45
+ this . insertAfter ( this . tail , node ) ;
59
46
}
60
47
61
48
insertBefore ( node , nodeToInsert ) {
62
- let currentNodeFromHead = this . head ;
63
- let currentNodeFromTail = this . tail ;
64
-
65
- while ( currentNodeFromHead != currentNodeFromTail ) {
66
- if ( node === this . head ) this . head = nodeToInsert ;
49
+ this . remove ( nodeToInsert ) ;
67
50
68
- if ( currentNodeFromHead === node ) {
69
- nodeToInsert . prev . next = nodeToInsert . next ;
70
- nodeToInsert . next . prev = nodeToInsert . prev ;
51
+ if ( node === this . head ) this . head = nodeToInsert ;
71
52
72
- nodeToInsert . prev = currentNodeFromHead . prev ;
73
- nodeToInsert . next = currentNodeFromHead ;
74
- currentNodeFromHead . prev . next = nodeToInsert ;
75
- currentNodeFromHead . prev = nodeToInsert ;
53
+ if ( ! node ) return ;
76
54
77
- break ;
78
- }
79
-
80
- if ( currentNodeFromTail === node ) {
81
- nodeToInsert . prev . next = nodeToInsert . next ;
82
- nodeToInsert . next . prev = nodeToInsert . prev ;
83
-
84
- nodeToInsert . prev = currentNodeFromTail . prev ;
85
- nodeToInsert . next = currentNodeFromTail ;
86
- currentNodeFromTail . prev . next = nodeToInsert ;
87
- currentNodeFromTail . prev = nodeToInsert ;
88
-
89
- break ;
90
- }
91
-
92
- currentNodeFromHead = currentNodeFromHead . next ;
93
- currentNodeFromTail = currentNodeFromTail . prev ;
94
- }
55
+ nodeToInsert . prev = node . prev ;
56
+ nodeToInsert . next = node ;
57
+ if ( node . prev ) node . prev . next = nodeToInsert ;
58
+ node . prev = nodeToInsert ;
95
59
}
96
60
97
61
insertAfter ( node , nodeToInsert ) {
98
- let currentNodeFromHead = this . head ;
99
- let currentNodeFromTail = this . tail ;
100
-
101
- while ( currentNodeFromHead != currentNodeFromTail ) {
102
- if ( currentNodeFromHead === node ) {
103
- if ( nodeToInsert . prev ) nodeToInsert . prev . next = nodeToInsert . next ;
104
- if ( nodeToInsert . next ) nodeToInsert . next . prev = nodeToInsert . prev ;
105
-
106
- nodeToInsert . prev = currentNodeFromHead ;
107
- nodeToInsert . next = currentNodeFromHead . next ;
108
- if ( currentNodeFromHead . next )
109
- currentNodeFromHead . next . prev = nodeToInsert ;
110
- currentNodeFromHead . next = nodeToInsert ;
111
-
112
- break ;
113
- }
114
-
115
- if ( currentNodeFromTail === node ) {
116
- if ( node === this . tail ) this . tail = nodeToInsert ;
117
-
118
- if ( nodeToInsert . prev ) nodeToInsert . prev . next = nodeToInsert . next ;
119
- if ( nodeToInsert . next ) nodeToInsert . next . prev = nodeToInsert . prev ;
62
+ this . remove ( nodeToInsert ) ;
120
63
121
- nodeToInsert . prev = currentNodeFromTail ;
122
- nodeToInsert . next = currentNodeFromTail . next ;
123
- if ( currentNodeFromTail . next )
124
- currentNodeFromTail . next . prev = nodeToInsert ;
125
- currentNodeFromTail . next = nodeToInsert ;
64
+ if ( node === this . tail ) this . tail = nodeToInsert ;
126
65
127
- break ;
128
- }
66
+ if ( ! node ) return ;
129
67
130
- currentNodeFromHead = currentNodeFromHead . next ;
131
- currentNodeFromTail = currentNodeFromTail . prev ;
132
- }
68
+ nodeToInsert . prev = node ;
69
+ nodeToInsert . next = node . next ;
70
+ if ( node . next ) node . next . prev = nodeToInsert ;
71
+ node . next = nodeToInsert ;
133
72
}
134
73
135
74
insertAtPosition ( position , nodeToInsert ) {
136
75
let currentNode = this . head ;
76
+ let currentPosition = 1 ;
137
77
138
78
while ( currentNode ) {
139
- if ( currentNode . value === value ) {
79
+ if ( currentPosition === position ) {
80
+ this . insertBefore ( currentNode , nodeToInsert ) ;
81
+
82
+ break ;
140
83
}
141
84
142
85
currentNode = currentNode . next ;
86
+ currentPosition += 1 ;
143
87
}
144
88
}
145
89
@@ -148,53 +92,46 @@ class DoublyLinkedList {
148
92
149
93
while ( currentNode ) {
150
94
if ( currentNode . value === value ) {
151
- if ( currentNode === this . head ) this . head = currentNode . next ;
152
- if ( currentNode === this . tail ) this . tail = currentNode . prev ;
153
-
154
- if ( currentNode . prev ) currentNode . prev . next = currentNode . next ;
155
-
156
- if ( currentNode . next ) currentNode . next . prev = currentNode . prev ;
95
+ this . remove ( currentNode ) ;
157
96
}
158
97
159
98
currentNode = currentNode . next ;
160
99
}
161
100
}
162
101
163
102
remove ( node ) {
164
- let currentNodeFromHead = this . head ;
165
- let currentNodeFromTail = this . tail ;
166
-
167
- while ( currentNodeFromHead != currentNodeFromTail ) {
168
- if ( currentNodeFromHead === node ) {
169
- currentNodeFromHead . prev . next = currentNodeFromHead . next ;
170
- currentNodeFromHead . next . prev = currentNodeFromHead . prev ;
171
- break ;
172
- }
103
+ this . setHeadOrTail ( node ) ;
173
104
174
- if ( currentNodeFromTail === node ) {
175
- currentNodeFromTail . prev . next = currentNodeFromTail . next ;
176
- currentNodeFromTail . next . prev = currentNodeFromTail . prev ;
177
- break ;
178
- }
105
+ if ( node . next ) node . next . prev = node . prev ;
106
+ if ( node . prev ) node . prev . next = node . next ;
179
107
180
- currentNodeFromHead = currentNodeFromHead . next ;
181
- currentNodeFromTail = currentNodeFromTail . prev ;
182
- }
108
+ // node.prev = null;
109
+ // node.next = null;
183
110
}
184
111
185
112
containsNodeWithValue ( value ) {
186
113
let currentNode = this . head ;
187
- let isValueExist = false ;
188
-
189
- while ( currentNode ) {
190
- if ( currentNode . value === value ) {
191
- isValueExist = true ;
192
- }
193
114
115
+ while ( currentNode && currentNode . value !== value ) {
194
116
currentNode = currentNode . next ;
195
117
}
196
118
197
- return isValueExist ;
119
+ return ! ! currentNode ;
120
+ }
121
+
122
+ setHeadOrTail ( node ) {
123
+ if ( this . head === node ) {
124
+ this . head = node . next ;
125
+ }
126
+
127
+ if ( this . tail === node ) {
128
+ this . tail = node . prev ;
129
+ }
130
+
131
+ if ( ! this . head && ! this . tail ) {
132
+ this . head = node ;
133
+ this . tail = node ;
134
+ }
198
135
}
199
136
}
200
137
@@ -231,10 +168,12 @@ doublyLinkedList.getWholeListFromTail();
231
168
doublyLinkedList . setHead ( four ) ;
232
169
doublyLinkedList . setTail ( six ) ;
233
170
doublyLinkedList . insertBefore ( six , three ) ;
234
- doublyLinkedList . insertAfter ( six , three3 ) ;
171
+ doublyLinkedList . insertAfter ( six , three2 ) ;
172
+ doublyLinkedList . insertAtPosition ( 1 , three3 ) ;
235
173
doublyLinkedList . removeNodesWithValue ( 3 ) ;
236
174
doublyLinkedList . remove ( two ) ;
237
175
doublyLinkedList . containsNodeWithValue ( 5 ) ;
176
+ doublyLinkedList . containsNodeWithValue ( 8 ) ;
238
177
239
178
doublyLinkedList . getWholeListFromHead ( ) ;
240
179
doublyLinkedList . getWholeListFromTail ( ) ;
0 commit comments