介绍
如何在Java中利用栈来反转链表?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
栈是一个特殊的数据结构,特点是先进后出(姓在简称费罗),这种特殊的数据结构,可以用在对链表做反转中,或者字符串逆序,因为要把头变成尾,尾变成头,栈这种结构最合适不过了,下面来看看如何用栈来做链表的反转。
package com.xxx.algorithm.sort; import java.util.Stack; {public class  LinkedListReverse ,public static  Node reverseLinkedList (Node 头){ ,Stackstack =, 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 (Stackhelp =, 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中利用栈来反转链表