File tree Expand file tree Collapse file tree 1 file changed +190
-0
lines changed Expand file tree Collapse file tree 1 file changed +190
-0
lines changed Original file line number Diff line number Diff line change 1+ class  Node  { 
2+     constructor ( val )  { 
3+         this . val  =  val 
4+         this . prev  =  null 
5+         this . next  =  null 
6+     } 
7+ } 
8+ 
9+ class  DoublyLinkedList  { 
10+     constructor ( )  { 
11+         this . head  =  null 
12+         this . tail  =  null 
13+         this . length  =  0 
14+     } 
15+ 
16+     insertAtTail ( val )  { 
17+         const  node  =  new  Node ( val ) 
18+ 
19+         if  ( ! this . head )  { 
20+             this . head  =  node 
21+             this . tail  =  node 
22+             this . length ++ 
23+         }  else  { 
24+             node . prev  =  this . tail 
25+             this . tail . next  =  node 
26+             this . tail  =  node 
27+             this . length ++ 
28+         } 
29+     } 
30+ 
31+     insertAtHead ( val )  { 
32+         const  node  =  new  Node ( val ) 
33+ 
34+         if  ( ! this . head )  { 
35+             this . head  =  node 
36+             this . tail  =  node 
37+             this . length ++ 
38+         }  else  { 
39+             node . next  =  this . head 
40+             this . head . prev  =  node 
41+             this . head  =  node 
42+             this . length ++ 
43+         } 
44+     } 
45+ 
46+     deleteAtTail ( )  { 
47+         if  ( ! this . head )  throw  new  Error ( "Empty Linked List!" ) 
48+ 
49+         if  ( this . length  ===  1 )  { 
50+             this . head  =  null 
51+             this . tail  =  null 
52+             this . length -- 
53+         }  else  { 
54+             this . tail  =  this . tail . prev 
55+             this . tail . next  =  null 
56+             this . length -- 
57+         } 
58+     } 
59+ 
60+     deleteAtHead ( )  { 
61+         if  ( ! this . head )  throw  new  Error ( "Empty Linked List!" ) 
62+ 
63+         if  ( this . length  ===  1 )  { 
64+             this . head  =  null 
65+             this . tail  =  null 
66+             this . length -- 
67+         }  else  { 
68+             this . head  =  this . head . next 
69+             this . head . prev  =  null 
70+             this . length -- 
71+         } 
72+     } 
73+ 
74+     print ( )  { 
75+         if  ( ! this . head )  console . log ( "Empty Linked List!" ) 
76+ 
77+         else  { 
78+             let  curr  =  this . head 
79+             let  str  =  "null <- " 
80+             while  ( curr )  { 
81+                 str  +=  curr . val 
82+                 if  ( curr . next )  { 
83+                     str  +=  " <-> " 
84+                 }  else  { 
85+                     str  +=  " -> null" 
86+                 } 
87+                 curr  =  curr . next 
88+             } 
89+             console . log ( str ) 
90+         } 
91+     } 
92+ 
93+     getLength ( )  { 
94+         return  this . length 
95+     } 
96+ 
97+     getAtIdx ( idx )  { 
98+         if  ( idx  >=  this . length  ||  idx  <  0 )  throw  new  Error ( "Index out of bounds!" ) 
99+ 
100+         else  { 
101+             let  currIdx  =  0 
102+             let  curr  =  this . head 
103+ 
104+             while  ( currIdx  <  idx )  { 
105+                 curr  =  curr . next 
106+                 currIdx ++ 
107+             } 
108+ 
109+             return  curr . val 
110+         } 
111+     } 
112+ 
113+     putAtIdx ( val ,  idx )  { 
114+         if  ( idx  >  this . length  ||  idx  <  0 )  throw  new  Error ( "Index out of bounds!" ) 
115+ 
116+         const  node  =  new  Node ( val ) 
117+ 
118+         if  ( idx  ===  0 )  { 
119+             this . head . prev  =  node 
120+             node . next  =  this . head 
121+             this . head  =  node 
122+         }  else  { 
123+             let  currIdx  =  0 
124+             let  curr  =  this . head 
125+ 
126+             while  ( currIdx  <  idx )  { 
127+                 curr  =  curr . next 
128+                 currIdx ++ 
129+             } 
130+ 
131+             node . next  =  curr 
132+             node . prev  =  curr . prev 
133+             curr . prev . next  =  node 
134+         } 
135+ 
136+         this . length ++ 
137+     } 
138+ 
139+     deleteAtIdx ( idx )  { 
140+         if  ( idx  >=  this . length  ||  idx  <  0 )  throw  new  Error ( "Index out of bounds!" ) 
141+ 
142+         let  currIdx  =  0 
143+         let  curr  =  this . head 
144+ 
145+         while  ( currIdx  <  idx )  { 
146+             curr  =  curr . next 
147+             currIdx ++ 
148+         } 
149+ 
150+         curr . prev . next  =  curr . next 
151+         curr . next . prev  =  curr . prev 
152+         this . length -- 
153+     } 
154+ 
155+     search ( val )  { 
156+         let  curr  =  this . head 
157+         let  currIdx  =  0 
158+ 
159+         while  ( curr )  { 
160+             if  ( curr . val  ===  val )  return  currIdx 
161+ 
162+             curr  =  curr . next 
163+             currIdx ++ 
164+         } 
165+ 
166+         return  "Value not found" 
167+     } 
168+ 
169+     toArray ( )  { 
170+         let  arr  =  [ ] 
171+ 
172+         let  curr  =  this . head 
173+ 
174+         while  ( curr )  { 
175+             arr . push ( curr . val ) 
176+             curr  =  curr . next 
177+         } 
178+ 
179+         return  arr 
180+     } 
181+ } 
182+ 
183+ // SAMPLE USECASE 
184+ const  list  =  new  DoublyLinkedList  ( ) 
185+ list . insertAtHead  ( 10 ) 
186+ list . insertAtTail  ( 20 ) 
187+ list . insertAtHead  ( 30 ) 
188+ list . insertAtTail  ( 40 ) 
189+ list . putAtIdx  ( 100 ,  2 ) 
190+ list . print  ( ) 
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments