class ĠNode < T >( value : ĠT ){ ĊĠĠĠ Ġvar Ġvalue : T Ġ= Ġvalue ĊĠĠĠ Ġvar Ġnext : ĠNode < T >? Ġ= Ġnull ĊĠĠĠ Ġvar Ġprevious : Node < T >? Ġ= Ġnull Ċ } Ċ class ĠLinkedList < T > Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġhead : Node < T >? Ġ= Ġnull ĊĠĠĠ Ġvar ĠisEmpty : Boolean Ġ= Ġhead Ġ== Ġnull ĊĠĠĠ Ġfun Ġfirst (): Node < T >? Ġ= Ġhead ĊĠĠĠ Ġfun Ġlast (): ĠNode < T >? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnode Ġ= Ġhead ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( node ?. next Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode ?. next ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġcount (): Int Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnode Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcounter Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( node ?. next Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode ?. next ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcounter ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġnode AtIndex ( index : ĠInt ) Ġ: ĠNode < T >? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnode Ġ= Ġhead ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 0 ) Ġreturn Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode . next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġappend ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠnewNode Ġ= ĠNode ( value ) ĊĠĠĠĠĠĠĠ Ġvar Ġlast Node Ġ= Ġthis . last () ĊĠĠĠĠĠĠĠ Ġif Ġ( last Node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewNode . previous Ġ= Ġlast Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Node . next Ġ= ĠnewNode ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ġ= ĠnewNode ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġremove All () Ġ{ ĊĠĠĠĠĠĠĠ Ġhead Ġ= Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġremove Node ( node : ĠNode < T >): T Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprev Ġ= Ġnode . previous ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġnode . next ĊĠĠĠĠĠĠĠ Ġif Ġ( prev Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev . next Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnext ?. previous Ġ= Ġprev ĊĠĠĠĠĠĠĠ Ġnode . previous Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġnode . next Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġnode . value ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġremove Last () Ġ: ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġthis . last () ĊĠĠĠĠĠĠĠ Ġif Ġ( last Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġremove Node ( last ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġremove AtIndex ( index : ĠInt ): T ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġnode AtIndex ( index ) ĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġremove Node ( node ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġ"[" ĊĠĠĠĠĠĠĠ Ġvar Ġnode Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġwhile Ġ( node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ"${ node . value }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode . next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġ!= Ġnull ) Ġ{ Ġs Ġ+= Ġ", Ġ" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġs Ġ+ Ġ" ]" ĊĠĠĠ Ġ} Ċ } Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġvar Ġll Ġ= ĠLinkedList < String >() ĊĠĠĠ Ġll . append (" John ") ĊĠĠĠ Ġprintln ( ll ) ĊĠĠĠ Ġll . append (" Car l ") ĊĠĠĠ Ġprintln ( ll ) ĊĠĠĠ Ġll . append (" Z ack ") ĊĠĠĠ Ġprintln ( ll ) ĊĠĠĠ Ġll . append (" Tim ") ĊĠĠĠ Ġprintln ( ll ) ĊĠĠĠ Ġll . append (" Ste ve ") ĊĠĠĠ Ġprintln ( ll ) ĊĠĠĠ Ġll . append (" P eter ") ĊĠĠĠ Ġprintln ( ll ) ĊĠĠĠ Ġprint ("\ n \ n ") ĊĠĠĠ Ġprintln (" first Ġitem : Ġ${ ll . first ()?. value }") ĊĠĠĠ Ġprintln (" last Ġitem : Ġ${ ll . last ()?. value }") ĊĠĠĠ Ġprintln (" second Ġitem : Ġ${ ll . first ()?. next ?. value }") ĊĠĠĠ Ġprintln (" pen ult imate Ġitem : Ġ${ ll . last ()?. previous ?. value }") ĊĠĠĠ Ġprintln ("\ n 4 th Ġitem : Ġ${ ll . node AtIndex ( 3 )?. value }") ĊĠĠĠ Ġprintln ("\ nt he Ġlist Ġhas Ġ${ ll . count ()} Ġitems ") Ċ } Ċ