class LinkedList{
late Map head;
late var tail;
late int length;
LinkedList(value){
this.head = {
'value': value,
'next': null,
};
this.tail = this.head;
this.length = 1;
}
// let linkedList = {
// head:{
// value:10,
// next{
// value:5,
// next: next{
// value:6,
// next:null
// }
// }
// }
// }
// add at the back
append(value){
var newNode = {
'value': value,
'next': null,
};
tail['next'] = newNode;
tail = newNode;
length++;
}
// add to front
prepend(value){
var newNode = {
'value': value,
'next': head
};
head = newNode;
length++;
}
// add at any position and increment length
prinlnt(index){
if(index != 0){
dynamic array = [];
dynamic currentNode = head;
while(currentNode != null){
array.add(currentNode['value']);
currentNode = currentNode['next'];
}
print(array);
}
}
insert(index, value){
var newNode = {
'value': value,
'next': null,
};
if(index == 0){
this.prepend(value);
}else if(index >= length){
this.append(value);
}else{
dynamic previousNode = traverseList(index -1);
// this commented is also valid but might take more time;
// dynamic currentNode = traverseList(index );
//but this will take more memory
dynamic pointer = previousNode['next'] ;
previousNode['next'] = newNode;
newNode['next'] = pointer;;
// newNode['next'] = currentNode;
length++;
}
}
remove(index){
if(index == 0){
dynamic pointer = head['next'];
// head = null;
head = pointer;
length--;
}else if(index == length-1){
dynamic previousNode = traverseList(index -1);
dynamic pointer = tail['next'];
// tail = null;
previousNode['next'] = pointer;
length--;
}else{
dynamic previousNode = traverseList(index -1);
dynamic unwantedNode = previousNode['next'];
previousNode['next'] = unwantedNode['next'];
length--;
}
}
reverse(){
dynamic first = head;
tail = head;
dynamic second = head['next'];
if(first['next'] == null){
return first;
}
while(second != null ){
dynamic third = second['next'];
second['next'] = first;
first = second;
second = third;
}
head['next'] = null;
head = first;
}
traverseList(index){
dynamic currentNode = head;
int counter = 0;
while(counter != index){
currentNode = currentNode['next'];
counter++;
}
return currentNode;
}
@override
String toString (){
return 'Head: ${head} Tail: $tail length: $length';
}
}
void main() {
LinkedList linkedList = new LinkedList(10);
linkedList.append(5);
linkedList.prepend(6);
linkedList.insert(1,4);
linkedList.insert(20,90);
print(linkedList);
linkedList.prinlnt(7);
// linkedList.remove(2);
linkedList.reverse();
print(linkedList);
linkedList.prinlnt(7);
}