Skip to content

Commit 6fafdda

Browse files
committed
doublylinkedlist
1 parent 286dee2 commit 6fafdda

File tree

1 file changed

+199
-0
lines changed

1 file changed

+199
-0
lines changed
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
//Hamza chabchoub contribution for a university project
2+
function doubleLinkedList() {
3+
let Node = function(element) {
4+
this.element = element;
5+
this.next = null;
6+
this.prev = null;
7+
}
8+
9+
let length = 0;
10+
let head = null;
11+
let tail = null;
12+
13+
//Add new element
14+
this.append = function(element) {
15+
let node = new Node(element),
16+
current = head,
17+
previous;
18+
19+
if(!head){
20+
head = node;
21+
tail = node;
22+
}else{
23+
node.prev = tail;
24+
tail.next = node;
25+
tail = node;
26+
}
27+
28+
length++;
29+
}
30+
31+
32+
//Add element
33+
this.insert = function(position, element) {
34+
35+
//Check of out-of-bound values
36+
if(position >= 0 && position <= length){
37+
let node = new Node(element),
38+
current = head,
39+
previous,
40+
index = 0;
41+
42+
if(position === 0){
43+
if(!head){
44+
head = node;
45+
tail = node;
46+
}else{
47+
node.next = current;
48+
current.prev = node;
49+
head = node;
50+
}
51+
}else if(position === length){
52+
current = tail;
53+
current.next = node;
54+
node.prev = current;
55+
tail = node;
56+
}else{
57+
while(index++ < position){
58+
previous = current;
59+
current = current.next;
60+
}
61+
62+
node.next = current;
63+
previous.next = node;
64+
65+
//New
66+
current.prev = node;
67+
node.prev = previous;
68+
}
69+
70+
length++;
71+
return true;
72+
}else{
73+
return false;
74+
}
75+
}
76+
77+
//Remove element at any position
78+
this.removeAt = function(position){
79+
//look for out-of-bounds value
80+
if(position > -1 && position < length){
81+
let current = head, previous, index = 0;
82+
83+
//Removing first item
84+
if(position === 0){
85+
head = current.next;
86+
87+
//if there is only one item, update tail //NEW
88+
if(length === 1){
89+
tail = null;
90+
}else{
91+
head.prev = null;
92+
}
93+
}else if(position === length - 1){
94+
current = tail;
95+
tail = current.prev;
96+
tail.next = null;
97+
}else{
98+
while(index++ < position){
99+
previous = current;
100+
current = current.next;
101+
}
102+
103+
//link previous with current's next - skip it
104+
previous.next = current.next;
105+
current.next.prev = previous;
106+
}
107+
108+
length--;
109+
return current.element;
110+
}else{
111+
return null;
112+
}
113+
}
114+
115+
//Get the indexOf item
116+
this.indexOf = function(elm){
117+
let current = head,
118+
index = -1;
119+
120+
//If element found then return its position
121+
while(current){
122+
if(elm === current.element){
123+
return ++index;
124+
}
125+
126+
index++;
127+
current = current.next;
128+
}
129+
130+
//Else return -1
131+
return -1;
132+
};
133+
134+
//Find the item in the list
135+
this.isPresent = (elm) => {
136+
return this.indexOf(elm) !== -1;
137+
};
138+
139+
//Delete an item from the list
140+
this.delete = (elm) => {
141+
return this.removeAt(this.indexOf(elm));
142+
};
143+
144+
//Delete first item from the list
145+
this.deleteHead = function(){
146+
this.removeAt(0);
147+
}
148+
149+
//Delete last item from the list
150+
this.deleteTail = function(){
151+
this.removeAt(length-1);
152+
}
153+
154+
//Print item of the string
155+
this.toString = function(){
156+
let current = head,
157+
string = '';
158+
159+
while(current){
160+
string += current.element + (current.next ? '\n' : '');
161+
current = current.next;
162+
}
163+
164+
return string;
165+
};
166+
167+
//Convert list to array
168+
this.toArray = function(){
169+
let arr = [],
170+
current = head;
171+
172+
while(current){
173+
arr.push(current.element);
174+
current = current.next;
175+
}
176+
177+
return arr;
178+
};
179+
180+
//Check if list is empty
181+
this.isEmpty = function(){
182+
return length === 0;
183+
};
184+
185+
//Get the size of the list
186+
this.size = function(){
187+
return length;
188+
}
189+
190+
//Get the head
191+
this.getHead = function() {
192+
return head;
193+
}
194+
195+
//Get the tail
196+
this.getTail = function() {
197+
return tail;
198+
}
199+
}

0 commit comments

Comments
 (0)