从尾到头打印链表(java)
2016-03-03 10:17
155 查看
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。
通常打印是一个只读操作,我们不希望打印时修改内容。
接下来我们想到解决这个问题肯定要遍历链表。遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头。也就是说第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出。这就是典型的“ 后进先出”,可以用栈实现这种顺序。每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。
package offer;
import java.util.Stack;
public class PrintListReverse {
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
node1.next = node2;
node2.next = node3;
printReverseList(node1);
System.out.println();
printReverseListRecursive(node1);
}
/**
* 从尾到头打印链表
* @param root
*/
public static void printReverseList(ListNode root){
if(root==null) return;
ListNode node = root;
Stack<ListNode> stack = new Stack<ListNode>();
while(node!=null){
stack.push(node);
node = node.next;
}
while(!stack.isEmpty()){
int val = stack.pop().val;
System.out.print(val+" ");
}
}
/**
* 递归写法
* @param root
*/
public static void printReverseListRecursive(ListNode root){
if(root==null) return;
printReverseList(root.next);
System.out.print(root.val+" ");
}
public static void printReverseListRecursive2(ListNode root){
if(root!=null){
if(root.next!=null){
printReverseListRecursive2(root.next);
}
System.out.print(root.val+" ");
}
}
}
/*class ListNode{
ListNode next;
int val;
}*/
既然想到了用栈实现这个函数,而递归在本质上就是一个栈结构,于是很自然地用想到了用递归来实现。要实现反过来输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点本身。
通常打印是一个只读操作,我们不希望打印时修改内容。
接下来我们想到解决这个问题肯定要遍历链表。遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头。也就是说第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出。这就是典型的“ 后进先出”,可以用栈实现这种顺序。每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。
package offer;
import java.util.Stack;
public class PrintListReverse {
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
node1.next = node2;
node2.next = node3;
printReverseList(node1);
System.out.println();
printReverseListRecursive(node1);
}
/**
* 从尾到头打印链表
* @param root
*/
public static void printReverseList(ListNode root){
if(root==null) return;
ListNode node = root;
Stack<ListNode> stack = new Stack<ListNode>();
while(node!=null){
stack.push(node);
node = node.next;
}
while(!stack.isEmpty()){
int val = stack.pop().val;
System.out.print(val+" ");
}
}
/**
* 递归写法
* @param root
*/
public static void printReverseListRecursive(ListNode root){
if(root==null) return;
printReverseList(root.next);
System.out.print(root.val+" ");
}
public static void printReverseListRecursive2(ListNode root){
if(root!=null){
if(root.next!=null){
printReverseListRecursive2(root.next);
}
System.out.print(root.val+" ");
}
}
}
/*class ListNode{
ListNode next;
int val;
}*/
既然想到了用栈实现这个函数,而递归在本质上就是一个栈结构,于是很自然地用想到了用递归来实现。要实现反过来输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点本身。
相关文章推荐
- 匿名内部类 传参 java
- Java数组操作的方法
- Java的内存分配
- Java 三大特性
- JAVA可变参数(Varargs)
- Android Studio导入eclipse的工程
- Android Studio导入eclipse的工程
- Java基础系列5:访问控制权限
- Java中hashCode的作用
- java.net.URISyntaxException的简单处理方法
- 解决springmvc ResponseBody请求返回406的问题
- Spring框架
- Java基础系列:(4)多线程的一些用法示例
- spring设置多个ViewResolver
- JVM 基础知识(GC)
- k近邻算法的Java实现
- manven 4 MyEclipse 安装
- XTU 1203 A simple problem
- Java中OutOfMemoryError(内存溢出)
- Java