剑指offer——链表反转之栈方法

来源:互联网 发布:linux怎么进入vim 编辑:程序博客网 时间:2024/06/08 17:14

题目:输入一个链表的头结点,从头到尾的打印出每个结点的值

上一次我用递归的思想实现了链表的反转,这次我将使用栈的思想来解决会问问题,因为栈的特殊性,后入先出的特点,所以我们可以将链表内的元素遍历,然后在循环中push进一个全新的栈中,之后再打印栈即可。相比起递归的思想,我更加喜欢借助栈的思想解决问题,因为Java的特殊性,为我么提示了许多形成的函数方法可以使用。下面将展示代码:

package ListNode;import java.util.Stack;public class Node {private Node next;private String value;public Node(String value) {// TODO Auteo-generated constructor stubthis.value = value;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}/* * 利用栈实现链表的反转算法 *  * */public static void ReverList(Node node){Stack<Node> stack=new Stack<Node>();//创建一个全新的栈while(node!=null){//判断node不为空,进行遍历stack.push(node);//将链表的每个value压入栈中node=node.next;//node=node.next}while(!stack.empty()){//判断栈不为空Node temp = stack.pop();//创建temp的临时变量,承接栈的元素System.out.println(temp.value);//打印元素}}/* *  * 测试数据 *  * */    public static void main(String[] args) {                  Node head=new Node("a");          Node node1=new Node("b");          Node node2=new Node("c");          Node node3=new Node("d");          //初始化链表                  head.setNext(node1);          node1.setNext(node2);          node2.setNext(node3);                System.out.println("打印链表反转后:");              ReverList(head);          //设置head的下一个元素为null,注意:此时head已经成为链表尾部元素。          head.next=null;      }}
这里我将所有代码集成到了一个类中,将方法的调用都使用了static静态,大家可以拆分成多个类。
输出结果为:

打印链表反转后:
d
c
b
a