Skip to content

Commit a08ed40

Browse files
1st solution for Double Linked List Construction
1 parent d6d9660 commit a08ed40

File tree

2 files changed

+51
-112
lines changed

2 files changed

+51
-112
lines changed

src/linked-list-construction/linked-list-construction.js

+48-109
Original file line numberDiff line numberDiff line change
@@ -38,108 +38,52 @@ class DoublyLinkedList {
3838
}
3939

4040
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);
4842
}
4943

5044
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);
5946
}
6047

6148
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);
6750

68-
if (currentNodeFromHead === node) {
69-
nodeToInsert.prev.next = nodeToInsert.next;
70-
nodeToInsert.next.prev = nodeToInsert.prev;
51+
if (node === this.head) this.head = nodeToInsert;
7152

72-
nodeToInsert.prev = currentNodeFromHead.prev;
73-
nodeToInsert.next = currentNodeFromHead;
74-
currentNodeFromHead.prev.next = nodeToInsert;
75-
currentNodeFromHead.prev = nodeToInsert;
53+
if (!node) return;
7654

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;
9559
}
9660

9761
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);
12063

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;
12665

127-
break;
128-
}
66+
if (!node) return;
12967

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;
13372
}
13473

13574
insertAtPosition(position, nodeToInsert) {
13675
let currentNode = this.head;
76+
let currentPosition = 1;
13777

13878
while (currentNode) {
139-
if (currentNode.value === value) {
79+
if (currentPosition === position) {
80+
this.insertBefore(currentNode, nodeToInsert);
81+
82+
break;
14083
}
14184

14285
currentNode = currentNode.next;
86+
currentPosition += 1;
14387
}
14488
}
14589

@@ -148,53 +92,46 @@ class DoublyLinkedList {
14892

14993
while (currentNode) {
15094
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);
15796
}
15897

15998
currentNode = currentNode.next;
16099
}
161100
}
162101

163102
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);
173104

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;
179107

180-
currentNodeFromHead = currentNodeFromHead.next;
181-
currentNodeFromTail = currentNodeFromTail.prev;
182-
}
108+
// node.prev = null;
109+
// node.next = null;
183110
}
184111

185112
containsNodeWithValue(value) {
186113
let currentNode = this.head;
187-
let isValueExist = false;
188-
189-
while (currentNode) {
190-
if (currentNode.value === value) {
191-
isValueExist = true;
192-
}
193114

115+
while (currentNode && currentNode.value !== value) {
194116
currentNode = currentNode.next;
195117
}
196118

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+
}
198135
}
199136
}
200137

@@ -231,10 +168,12 @@ doublyLinkedList.getWholeListFromTail();
231168
doublyLinkedList.setHead(four);
232169
doublyLinkedList.setTail(six);
233170
doublyLinkedList.insertBefore(six, three);
234-
doublyLinkedList.insertAfter(six, three3);
171+
doublyLinkedList.insertAfter(six, three2);
172+
doublyLinkedList.insertAtPosition(1, three3);
235173
doublyLinkedList.removeNodesWithValue(3);
236174
doublyLinkedList.remove(two);
237175
doublyLinkedList.containsNodeWithValue(5);
176+
doublyLinkedList.containsNodeWithValue(8);
238177

239178
doublyLinkedList.getWholeListFromHead();
240179
doublyLinkedList.getWholeListFromTail();

src/linked-list-construction/linked-list-construction.test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ it("Test Case #1", function () {
6868
expect(getNodeValuesHeadToTail(linkedList)).toEqual([4, 1, 2, 5, 3, 6, 3]);
6969
expect(getNodeValuesTailToHead(linkedList)).toEqual([3, 6, 3, 5, 2, 1, 4]);
7070

71-
// linkedList.insertAtPosition(1, three3);
72-
// expect(getNodeValuesHeadToTail(linkedList)).toEqual([3, 4, 1, 2, 5, 3, 6, 3]);
73-
// expect(getNodeValuesTailToHead(linkedList)).toEqual([3, 6, 3, 5, 2, 1, 4, 3]);
71+
linkedList.insertAtPosition(1, three3);
72+
expect(getNodeValuesHeadToTail(linkedList)).toEqual([3, 4, 1, 2, 5, 3, 6, 3]);
73+
expect(getNodeValuesTailToHead(linkedList)).toEqual([3, 6, 3, 5, 2, 1, 4, 3]);
7474

7575
linkedList.removeNodesWithValue(3);
7676
expect(getNodeValuesHeadToTail(linkedList)).toEqual([4, 1, 2, 5, 6]);

0 commit comments

Comments
 (0)