import'dart:io';classLink{intdata;Linknext;Link(this.data){}voiddisplayLink(){stdout.write('$data ');}}classLinkList{Linkfirst;LinkList(){first=null;}LinkgetFirst(){returnfirst;}voidsetFirst(Linkitem){first=item;}boolisEmpty(){returnfirst==null;}ListIteratorgetIterator(){returnnewListIterator(this);}voiddisplayList(){Linkcurrent=first;while(current!=null){current.displayLink();current=current.next;}stdout.writeln();}}classListIterator{Linkcurrent;Linkprevious;LinkListourList;ListIterator(LinkListlist){ourList=list;reset();}voidreset(){current=ourList.getFirst();previous=null;}boolatEnd(){returncurrent.next==null;}voidnextLink(){previous=current;current=current.next;}LinkgetCurrent(){returncurrent;}voidinsertAfter(intdata){LinknewLink=newLink(data);if(ourList.isEmpty()){ourList.setFirst(newLink);current=newLink;}else{newLink.next=current.next;current.next=newLink;nextLink();}}voidinsertBefore(intdata){LinknewLink=newLink(data);if(previous==null){newLink.next=ourList.getFirst();ourList.setFirst(newLink);reset();}else{newLink.next=previous.next;previous.next=newLink;current=newLink;}}intdeleteCurrent(){intvalue=current.data;if(previous==null){ourList.setFirst(current.next);reset();}else{previous.next=current.next;if(atEnd()){reset();}else{current=current.next;}}returnvalue;}}voidmain(List<String>args){LinkListlinkList=newLinkList();ListIteratoriterator1=linkList.getIterator();intvalue;iterator1.insertAfter(20);iterator1.insertAfter(40);iterator1.insertAfter(80);iterator1.insertBefore(60);while(true){stdout.writeln('Enter first letter of: show, reset, next before, after, delete');Stringchoise=stdin.readLineSync();switch(choise){case's':if(!linkList.isEmpty()){linkList.displayList();}else{stdout.writeln('List is empty');}break;case'r':iterator1.reset();break;case'n':if(!linkList.isEmpty()&&!iterator1.atEnd()){iterator1.nextLink();}else{stdout.writeln("Can't go to next link");}break;case'g':if(!linkList.isEmpty()){value=iterator1.getCurrent().data;stdout.writeln('Retruned $value');}else{stdout.writeln('List is empty');}break;case'b':stdout.write('Enter value to insert: ');StringuserInput=stdin.readLineSync();value=int.parse(userInput);iterator1.insertBefore(value);break;case'a':stdout.write('Enter value to insert: ');StringuserInput=stdin.readLineSync();value=int.parse(userInput);iterator1.insertAfter(value);break;case'd':if(!linkList.isEmpty()){value=iterator1.deleteCurrent();stdout.writeln('Deletet $value');}else{stdout.writeln("Can't delete");}break;default:stdout.writeln('Invalud command');}}}