package Ġio . vin cent . learning . stack . algorithm . linked Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠV in cent Ġon Ġ 1 / 2 4 / 1 9 . Ċ Ġ* Ġ@ author ĠV in cent Ċ Ġ* Ġ@ since Ġ 1 . 0 , Ġ 1 / 2 4 / 1 9 Ċ Ġ*/ Ċ class ĠDo ub ly LinkedList < T > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠNode ( var Ġdata : ĠT ? Ġ= Ġnull , Ġvar Ġprev : ĠNode ? Ġ= Ġnull , Ġvar Ġnext : ĠNode ? Ġ= Ġnull ) ĊĊĠĠĠ Ġprivate Ġvar Ġhead : ĠNode ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtail : ĠNode ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġsize : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġadd Ġto Ġhead . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠaddTo Head ( e : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġhead Ġ= ĠNode ( e , Ġnull , Ġhead ) ĊĠĠĠĠĠĠĠ Ġif Ġ( tail Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead !!. next !!. prev Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsize ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġadd Ġto Ġlast . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd ( e : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewNode Ġ= ĠNode ( e , Ġtail , Ġnull ) ĊĠĠĠĠĠĠĠ Ġif Ġ( head Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ġ= ĠnewNode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail !!. next Ġ= ĠnewNode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail Ġ= ĠnewNode ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsize ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ( index : ĠInt ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetNode ByIndex ( index )?. data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove ( index : ĠInt ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 Ġ|| Ġindex Ġ>= Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" index : Ġ$ index ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIndex OutOfBoundsException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ åŃĺ æĶ¾ éľĢè¦ģ åĪłéĻ¤ çļĦ èĬĤçĤ¹ ĊĠĠĠĠĠĠĠ Ġval Ġdel : ĠNode ? ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdel Ġ= Ġhead ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ġ= Ġhead !!. next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead !!. prev Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Ġ= ĠgetNode ByIndex ( index Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdel Ġ= Ġprev !!. next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev . next Ġ= Ġdel !!. next ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( del . next Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdel . next !!. prev Ġ= Ġprev ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdel . next Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdel . prev Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsize -- ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdel ?. data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnext ( e : ĠT ?): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠindexOf ( e ) ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠgetNode ByIndex ( index Ġ+ Ġ 1 )?. data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠindexOf ( e : ĠT ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e Ġ== Ġnull ) Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ< Ġsize Ġ- 1 Ġ&& Ġcurrent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current . data Ġ== Ġe ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetNode ByIndex ( index : ĠInt ): ĠNode ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 Ġ|| Ġindex Ġ>= Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIndex OutOfBoundsException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġindex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 0 ) Ġreturn Ġ" []" ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ("[ ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("${ current . data }, Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . next ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsb . delete ( sb . length Ġ- Ġ 2 , Ġsb . length ). append (" ]"). toString () ĊĠĠĠ Ġ} Ċ } Ċ