题目描述* 剑指offer面试题5:从尾到头打印链表

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

解决方案一:首先遍历链表的节点后打印,典型的“后进先出”,可以使用栈来实现这种顺序。
解决方案二:栈的本质就是递归,直接使用递归的方式,打印一个节点的时候先打印它后面的节点,再打印该节点自身,实现反向打印
解决方案三:遍历链表,把链表中的元素复制到ArrayList中,然后逆序打印ArrayList中的元素,由于ArrayList底层使用数组实现,所以用数组也是同样的原理
解决方案四:前三种解决方案本身属于在打印链表的时候不修改链表本身结构,在允许修改链表结构的情况下可以把链表中的节点指针反转过来,改变链表方向,然后重新遍历打印改变方向后的链表。

 
 package Solution;

 import java.util.ArrayList;
import java.util.Stack; /**
* 剑指offer面试题5:从尾到头打印链表
* 输入一个链表的头结点,从尾到头打印出每个结点的值
* 解决方案一:首先遍历链表的节点后打印,典型的“后进先出”,可以使用栈来实现这种顺序。
* 解决方案二:栈的本质就是递归,直接使用递归的方式,打印一个节点的时候先打印它后面的节点,再打印该节点自身,实现反向打印
* 解决方案三:遍历链表,把链表中的元素复制到ArrayList中,然后逆序打印ArrayList中的元素
* 解决方案四:前三种解决方案本身属于在打印链表的时候不修改链表本身结构,
* 在允许修改链表结构的情况下可以把链表中的节点指针反转过来,改变链表方向,然后重新遍历打印改变方向后的链表
* @author GL
*
*/
public class No5PrintListFromTailToHead { public static void main(String[] args) {
ListNode node1=new ListNode(1);
ListNode node2=new ListNode(2);
ListNode node3=new ListNode(3);
ListNode node4=new ListNode(4);
ListNode node5=null;
ListNode node6=new ListNode(6);
ListNode node7=new ListNode();
node1.next=node2;
node2.next=node3;
node3.next=node4;
printListFromTailToHead(node1);
printListFromTailToHead(node5);
printListFromTailToHead(node6);
printListFromTailToHead(node7);
//使用栈实现逆序打印链表
printListFromTailToHeadByStack(node1);
//使用递归实现逆序打印链表
printListFromTailToHead(node1);
//使用递归反转实现逆序打印
printListFromTailToHeadByReverseList(node1);
//使用ArrayList逆序打印链表
printListFromTailToHeadByArrayList(node1);
} /*
* 方案一:通过使用栈结构,遍历链表,把先遍历的节点的值推入栈中,遍历结束后通过弹出栈内元素实现逆序打印
*/
public static void printListFromTailToHeadByStack(ListNode node){
Stack<Integer> stack=new Stack<Integer>();
while(node!=null){
stack.push(node.val);
node=node.next;
}
while(!stack.isEmpty()){
System.out.print(stack.pop()+",");
}
} /*
* 方案二:递归法逆序打印链表
*/
public static void printListFromTailToHead(ListNode node){
if(node!=null){
if(node.next!=null){
printListFromTailToHead(node.next);
}
System.out.print(node.val+",");
}
else
System.out.println("输入的链表为空");
} /*
* 方案三:使用ArrayList逆序打印链表
*/
public static void printListFromTailToHeadByArrayList(ListNode node){
if(node==null)
System.out.print("输入链表为null");
ArrayList<Integer> arrayList=new ArrayList<Integer>();
while(node!=null){
arrayList.add(node.val);
node=node.next;
}
for(int i=arrayList.size()-1;i>=0;i--){
System.out.print(arrayList.get(i)+",");
}
} /*
* 方案四:递归反转链表,后遍历打印
*/
public static void printListFromTailToHeadByReverseList(ListNode node){
ListNode reversedNode=reverse(node);
while(reversedNode!=null){
System.out.print(reversedNode.val+",");
reversedNode=reversedNode.next;
} }
//递归反转
private static ListNode reverse(ListNode head){
if(head.next==null)
return head;
ListNode reversedListNode=reverse(head.next);
head.next.next=head;
head.next=null;
return reversedListNode;
} }
class ListNode{
int val;
ListNode next=null;
public ListNode(){ }
public ListNode(int value){
this.val=value;
}
}

剑指offer编程题Java实现——面试题5从头到尾打印链表的更多相关文章

  1. 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

    用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...

  2. 剑指offer编程题Java实现——面试题10二进制中1的个数

    题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...

  3. 剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

    剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()- ...

  4. 剑指offer编程题Java实现——面试题7用两个栈实现队列

    题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能. package Solution; ...

  5. 剑指offer编程题Java实现——面试题6重建二叉树

    题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...

  6. 剑指offer编程题Java实现——面试题11数值的整数次方

    题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...

  7. 剑指offer编程题Java实现——面试题12打印1到最大的n位数

    题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...

  8. 剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前

    题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初 ...

  9. 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点 ...

随机推荐

  1. osgEarth基础入门(转载)

    osgEarth基础入门 osgEarth是基于三维引擎osg开发的三维数字地球引擎库,在osg基础上实现了瓦片调度插件,可选的四叉树调度插件,更多的地理数据加载插件(包括GDAL,ogr,WMS,T ...

  2. IO文件

    在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. Separator: 比如说要在te ...

  3. UVa 11456 - Trainsorting

    题目大意:给一个车辆到达车站的序列(按时间先后),可以对车辆进行以下处理:插在队首.插在队尾或者拒绝进站.车站内的车辆必须按照重量大小从大到小排列,问车站内最多能有多少辆车辆? 假设车i是第一个进站, ...

  4. java系列--HTTP协议

    一.HTTP请求信息 请求行 请求头 空行 消息体 1.防盗链: 枚举类型: 二.中文乱码问题 1.Get提交 String username = request.getParameter(" ...

  5. Struts2配置dtd约束

    Struts2和Struts1的区别: 一.elclipse-ee开发 搭建环境eclipse-ee 1.加入jar包  apps/struts2-blank.war解压 2.在web.xml文件中配 ...

  6. HUSTOJ 2796 && SPOJ1811

    传送门:http://begin.lydsy.com/JudgeOnline/problem.php?id=2796 题解:后缀自动机,很裸,但是感觉对后缀自动机还不是特别理解,毕竟我太蒟蒻,等我精通 ...

  7. 使用UTF8-CPP转换unicode编码 附录:UTF8和UTF16和UTF32和Unicode编码

    本文用于解决如何用C++处理字符串的编码格式.本文采用的是成熟便捷的UTF8库来处理这个问题.首先是下载UTF8库,网址为:http://utfcpp.sourceforge.net/ 为了方便后续使 ...

  8. prism silverlight

    转自  http://www.cnblogs.com/li-xiao/archive/2011/01/13/1934564.html   Prism简介 Prism是由微软Patterns & ...

  9. cpu95%,查找问题sql

    收到一封告警邮件: Load average on xxx_server reached critical threshold values - 169.5 Current Load Avg = 16 ...

  10. linux apache 打模块示例

    主要是为了以后能举一反三 Apache配置方案 首先,安装apache的一个第三方模块“mod_rpaf”, 官方网站: http://stderr.net/apache/rpaf/ wget htt ...