-
Notifications
You must be signed in to change notification settings - Fork 0
/
linkedListSimplified.js
152 lines (130 loc) · 3.46 KB
/
linkedListSimplified.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
class Node {
constructor(data){
this.data = data;
this.next = null;
}
}
class LinkedList{
constructor(){
this.head = null;
}
// three cases on insertion ***********
// inseerting a new node before the head.
insertAtBeginngin(data){
let newNode = new Node(data);
newNode.next = this.head;
this.head = newNode;
return this.head;
}
// inserting a new node after the tail.
// to implement this we have to travel all the way to end
// to find tail's next pointer which is pointing to null
insertAtTheEnd(data){
let newNode = new Node(data);
if(!this.head){
this.head = newNode;
return this.head;
}
let tail = this.head;
while(tail.next !== null){
tail = tail.next;
}
tail.next = newNode;
return this.head;
}
// inserting a new node in the middle of the list
//helper function to get the position
getAt(index){
let counter = 0;
let node = this.head;
while(node){
if(counter === index){
return node;
}
counter++;
node = node.next;
}
return null;
}
//inserting node at uses getAt helper function
insertAt(data, index){
if(!this.head){
this.head = new Node(data);
return;
}
if (index === 0){
this.head = new Node(data, this.head);
return;
}
//if not empty and index is not 0 then use getAt()
//to find previous node
const previous = this.getAt(index - 1);
let newNode = new Node(data);
newNode.next = previous.next;
previous.next = newNode;
return this.head;
}
// delete operation on a singly linked list
// deleting the first node
deleteFirstNode(){
if (!this.head){
return;
}
this.head = this.head.next;
return this.head;
}
// deleting the last node
deleteLastNode(){
if(!this.head){
return null;
}
if(!this.head.next){
this.head = null;
return;
}
let previous = this.head;
let tail = this.head.next;
while(tail.next !== null){
previous = tail;
tail = tail.next;
}
previous.next = null;
return this.head;
}
// deleting a node from the middle of the list
deleteAt(index){
if (!this.head){
this.head = new Node(data);
return;
}
if (index === 0){
this.head = this.head.next;
return;
}
// else, use getAt() to find the previous node
const previous = this.getAt(index-1);
if(!previous || !previous.next){
return;
}
previous.next = previous.next.next;
return this.head;
}
deleteList(){
this.head = null;
}
print() {
let string = '';
let current = this.head;
while(current) {
string += `${current.data} `;
current = current.next;
}
console.log(string.trim());
}
}
let list = new LinkedList();
list.insertAtBeginngin(2);
list.insertAtBeginngin(3);
list.insertAtTheEnd(4);
list.insertAtTheEnd(5);
list.print();