如何在Java中利用栈来反转链表

  介绍

如何在Java中利用栈来反转链表?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

栈是一个特殊的数据结构,特点是先进后出(姓在简称费罗),这种特殊的数据结构,可以用在对链表做反转中,或者字符串逆序,因为要把头变成尾,尾变成头,栈这种结构最合适不过了,下面来看看如何用栈来做链表的反转。

package  com.xxx.algorithm.sort;   import  java.util.Stack;   {public  class  LinkedListReverse    ,public  static  Node  reverseLinkedList (Node 头){   ,Stack stack =, new  Stack ();   ,而(头!=null) {   ,stack.push(头);=,,head  head.next;   ,}   ,如果(! stack.isEmpty ())=,,head  stack.pop ();   ,Node  cur =,头;   ,而(! stack.isEmpty ()) {   ,Node  Node =, stack.pop ();=,node.next 零;=,cur.next 节点;=,cur 节点;   ,}   ,return 头;   ,}   ,   ,public  static  void 显示器(Node 头){   ,System.out.print(“列表:“);   ,Node  cur =,头;   ,而(坏蛋!=null) {   ,System.out.print (cur +“→”);=,,cur  cur.next;   ,}   ,System.out.println ();   ,}   ,   ,public  static  void  main (String [], args), {   ,Node  a =, new 节点(“a");   ,Node  b =, new 节点(“b");   ,Node  c =, new 节点(“c");   ,Node  d =, new 节点(“d");   ,Node  e =, new 节点(“e");   ,Node  f =, new 节点(“f");   ,Node  g =, new 节点(“g");=,a.next  b;=,b.next  c;=,c.next  d;=,d.next  e;=,e.next  f;=,f.next  g;   ,System.out.println(“原始链表:“);   ,显示(一个);   ,Node  head =, reverseLinkedList(一个);   ,System.out.println(“反转之后的链表:“);   ,显示(头);   ,}   }   ,   {class 节点   ,String  val;   ,Node 下;   ,public 节点(String  val), {=,,this.val  val;   ,}   ,@Override   ,public  String  toString (), {   ,return “节点(“+ this.val +“)“;   ,}   }

运行程序,结果如下:

原始链表:

列表:节点(a)→节点(b)→节点(c)→节点(d)→节点(e)→节点(f)→节点(g)→

反转之后的链表:

列表:节点(g)→节点(f)→节点(e)→节点(d)→节点(c)→节点(b)→节点(a)→

通过栈来反转链表思路很简单,这只是说了栈作为一种数据结构,其实用途很广泛。今天要介绍的另外一个栈的用途是如何通过栈来排的序,利用栈来排的序,需要有两个栈,一个存放原始数据,一个是辅助排序用的。

具体思路就是:将栈中的数据依次放入辅助栈中,放入辅助栈的要求是按照数据从大到小的排列(或者从小到大),先进入的是较大的数,后进入的是较小的数,如果原栈中没有数据了,说明数据已经在辅助栈中排好序了,接着我们把数据再一次性放入原栈中,如果遍历,就是一个排好序的数组了。

这里面把原栈中的数据放入辅助栈中,需要借助一个中间变量,原栈中弹出的数据放入中间变量中,而不是直接入辅助栈,如果栈顶的元素小于中间变量,那么将小于的数据再放入原栈中,再将中间变量放入辅助栈,接着再将原栈中的数据放入辅助栈,直到原栈为空。将中间变量放入辅助栈,类似插入排序,需要找到一个合适的位置,而移动出一个合适的位置,就是把辅助栈中的数据再次压入原栈中。

算法示例代码如下:

package  com.xxx.algorithm.sort;   import  java.util.Iterator;   import  java.util.Stack;   public  class  StackSortDemo  {   ,   ,public  static  void  sortByStack (Stack help =, new  Stack ();   ,而(! stack.isEmpty ()) {   ,int  cur =, stack.pop ();   ,而(! help.isEmpty(),和help.peek () & lt; cur) {   ,stack.push (help.pop ());   ,}   ,help.push(坏蛋);   ,}   ,而(! help.isEmpty ()) {   ,stack.push (help.pop ());   ,}   ,}   ,   ,public  static  void 显示器(Stack it =, stack.iterator ();   ,而(it.hasNext ()) {   ,System.out.print (it.next () +“→”);   ,}   ,System.out.print (“null");   ,System.out.println ();   ,}   ,   ,public  static  void  main (String [], args), {   ,Stack

如何在Java中利用栈来反转链表