-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlinkedList.js
More file actions
128 lines (124 loc) · 4.72 KB
/
Copy pathlinkedList.js
File metadata and controls
128 lines (124 loc) · 4.72 KB
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
const util = require('util')
function LinkedList() {
let length = 0;
let head = null;
let Node = function(element) { // define a node in the linked list
this.element = element;
this.next = null;
}
this.size = function() { return length } // get linked list length
this.head = function() { return head } // return head of the linked list
this.add = function(element) { // add element to linked list
let node = new Node(element);
if(head === null) { head = node } else {
let currentNode = head;
while(currentNode.next) {
currentNode = currentNode.next;
}
currentNode.next = node;
}
length++;
}
this.remove = function(element) { // remove an element from the linked list by its data
let currentNode = head;
let previousNode;
if(currentNode.element === element) {
head = currentNode.next;
} else {
while(currentNode.element !== element) {
previousNode = currentNode;
currentNode = currentNode.next;
}
previousNode.next = currentNode.next;
}
length--;
}
this.isEmpty = function() { return length == 0 } // check if linked list is empty
this.indexOf = function(element) { // get index of an element
let currentNode = head;
let index = 0; // function return -1 if element is not in the linked list
if(currentNode.element === element) {
return index;
} else {
while(currentNode.element !== element) {
currentNode = currentNode.next;
index++;
}
if(currentNode !== null) { return index } else { return -1 }
}
}
this.elementAt = function(index) { // get element by index
let currentNode = head;
let currentIndex = 0;
while(currentNode && index !== currentIndex) {
currentNode = currentNode.next;
currentIndex++;
}
if(currentNode) { return currentNode.element } else {
return -1;
}
}
this.addAt = function(index, element) { // add element at given index
let node = new Node(element);
let currentNode = head;
let currentIndex = 0;
let previousNode;
if(index > length - 1) { return 'index out of range!' } else {
if(index === 0) {
node.next = head;
head = node;
length++;
return
}
while(index !== currentIndex) {
previousNode = currentNode;
currentNode = currentNode.next;
currentIndex++
}
previousNode.next = node;
node.next = currentNode;
length++;
}
}
this.removeAt = function(index) { // remove element at index
let currentNode = head;
let currentIndex = 0;
let previousNode;
if(index > length - 1) { return 'index out of range!' } else {
if(index === 0) {
head = head.next;
length--;
return
}
while(index !== currentIndex) {
previousNode = currentNode;
currentNode = currentNode.next;
currentIndex++
}
previousNode.next = currentNode.next;
length--;
}
}
}
let myll = new LinkedList();
console.log(myll.size()); // 0
console.log(myll.head()); // null
myll.add(12);
console.log(myll.size()); // 1
myll.add(34);
console.log(myll.size()); // 2
console.log(myll.head()); // Node {element:12,next:Node{ element: 34, next: null } }
myll.add(76);
myll.add(43);
console.log(myll.size()); // 4
myll.remove(76);
console.log(myll.size()); // 3
console.log(myll.indexOf(34)); // 1
console.log(myll.elementAt(4)); // -1
console.log(myll.head()); // Node {element:12,next:Node{element:34,next Node{element:43,next:null}}}
console.log(myll.addAt(7, 'lalala')); // index out of range!
console.log(myll.addAt(0, 'lalala')); // undefined
console.log(myll.addAt(2, 'lolo')); // undefined
console.log(util.inspect(myll.head(), {showHidden: false, depth: null})); // Node {element: 'lalala',next: Node {element: 12,next:Node {element: 'lolo',next: Node { element: 34, next: Node { element: 43, next: null } } } } }
console.log(myll.removeAt(2)); // undefined
console.log(util.inspect(myll.head(), {showHidden: false, depth: null})); // Node {element: 'lalala',next: Node {element: 12,next: Node { element: 34, next: Node { element: 43, next: null } } } }