本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集

题目

  输入一个链表的头结点,从尾到头反过来打印出每个结点的值。结点定义如下:

public class ListNode {
int val;
ListNode next = null; ListNode(int val) {
this.val = val;
}
}

思路

  结点遍历顺序只能从头到尾,但是输出的顺序却为从尾到头,是典型的“后进先出”问题,这就要联想到使用栈,从而也可以联想到使用递归。

测试用例

  1.功能测试(单个结点链表,多个结点链表)

  2.特殊输入测试(链表为空)

完整Java代码

import java.util.Stack;

/**
*
* @Description 从尾到头打印链表
*
* @author yongh
* @date 2018年9月10日 下午7:07:23
*/ //题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。 public class PrintListInReversedOrder {
class ListNode{
int key;
ListNode next;
public ListNode(int key) {
this.key=key;
this.next=null;
}
} // 采用栈
public void printListReversingly_Iteratively(ListNode node) {
Stack<ListNode> stack = new Stack<ListNode>();
while (node!= null) {
stack.push(node);
node=node.next;
}
while(!stack.empty()) {
System.out.println(stack.pop().key);
}
} //采用递归
public void printListReversingly_Recursively(ListNode node) {
if(node!=null) {
printListReversingly_Recursively(node.next);
System.out.println(node.key);
}else
return; } // ==================================测试代码==================================
/**
* 链表为空
*/
public void test1() {
ListNode aListNode = null;
System.out.println("采用栈:");
printListReversingly_Iteratively(aListNode);
System.out.println("采用递归:");
printListReversingly_Recursively(aListNode);
} /**
* 多个结点链表
*/
public void test2() {
ListNode ListNode1 = new ListNode(1);
ListNode ListNode2 = new ListNode(2);
ListNode ListNode3 = new ListNode(3);
ListNode ListNode4 = new ListNode(4);
ListNode ListNode5 = new ListNode(5);
ListNode1.next=ListNode2;
ListNode2.next=ListNode3;
ListNode3.next=ListNode4;
ListNode4.next=ListNode5;
System.out.println("采用栈:");
printListReversingly_Iteratively(ListNode1);
System.out.println("采用递归:");
printListReversingly_Recursively(ListNode1);
} /**
* 单个结点链表
*/
public void test3() {
ListNode ListNode1 = new ListNode(1);
System.out.println("采用栈:");
printListReversingly_Iteratively(ListNode1);
System.out.println("采用递归:");
printListReversingly_Recursively(ListNode1);
} public static void main(String[] args) {
PrintListInReversedOrder demo = new PrintListInReversedOrder();
System.out.println("test1:");
demo.test1();
System.out.println("test2:");
demo.test2();
System.out.println("test3:");
demo.test3();
}
}

  

test1:
采用栈:
采用递归:
test2:
采用栈:
5
4
3
2
1
采用递归:
5
4
3
2
1
test3:
采用栈:
1
采用递归:
1

PrintListInReversedOrder

递归部分代码也可以像下面这样写,注意体会不同的递归写法:

	// 采用递归
public void printListReversingly_Recursively(ListNode node) {
// if(node!=null) {
// printListReversingly_Recursively(node.next);
// System.out.println(node.key);
// }else
// return;
if (node != null) {
if (node.next != null) {
printListReversingly_Recursively(node.next);
}
System.out.println(node.key);
}
}

  

====================================================================

在牛客网中提交的代码如下(参考自:grass_stars 的代码):

public class Solution {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if (listNode != null) {
this.printListFromTailToHead(listNode.next);
arrayList.add(listNode.val);
}
return arrayList;
}
}

  上面代码采用的递归,非常简洁,很值得学习。

收获

  1.对于“后进先出”问题,要快速想到”栈“,也同时想到递归。

  2.采用递归时,返回的函数值不一定要有赋值操作,只要实现了遍历的作用就可以了,上面牛客网的代码可以多多学习。

更多:《剑指Offer》Java实现合集

【Java】 剑指offer(5) 从尾到头打印链表的更多相关文章

  1. 《剑指offer》从尾到头打印链表

    本题来自<剑指offer> 从尾到头打印链表 题目: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 方案一:首先遍历到尾部,然后从尾部进行到头值进行操作,后进先 ...

  2. 菜鸟刷题路:剑指 Offer 06. 从尾到头打印链表

    剑指 Offer 06. 从尾到头打印链表 class Solution { public int[] reversePrint(ListNode head) { Stack<Integer&g ...

  3. 力扣 - 剑指 Offer 06. 从尾到头打印链表.md

    题目 剑指 Offer 06. 从尾到头打印链表 思路1(递归) 首先先遍历整个脸表,计算出链表的长度(用于初始化数组).然后进行递归,从链表头部递归到尾部,这期间什么都不做,直到递归到最后一个节点的 ...

  4. Go语言实现:【剑指offer】从尾到头打印链表

    该题目来源于牛客网<剑指offer>专题.​ 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. Go语言实现: type ListNode struct { Val int ...

  5. [剑指Offer] 3.从尾到头打印链表

    题目描述 输入一个链表,从尾到头打印链表每个节点的值. [思路]用一个vector存储,遍历链表时每次从前面插入 /** * struct ListNode { * int val; * struct ...

  6. [剑指offer]6.从尾到头打印链表+18.删除链表节点

    链表 6.从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 方法一 迭代 创建空列表res,将链表值head.val依次存进res,返回翻转后的res 代码 cl ...

  7. 剑指 Offer 06. 从尾到头打印链表

    链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/ 标签:链表 题目 输入一个链表的头节点,从尾到头 ...

  8. 剑指Offer 3. 从尾到头打印链表 (链表)

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 题目地址 https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35 ...

  9. 剑指offer :从尾到头打印链表

    题目描述: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路: 链表的遍历只能从头向尾进行,要从尾到头输出,考虑用栈.先从头到尾遍历一次链表,同时将值进栈,再清空栈,同时将值 ...

随机推荐

  1. input单选框多选框时可用的事件

    change(): 当元素的值发生改变时,会发生 change 事件. 该事件仅适用于文本域(text field),以及 textarea 和 select 元素. change() 函数触发 ch ...

  2. luogu 4158 粉刷匠 dp套dp

    dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ...

  3. 数据库之MySQL ERROR 1698 (28000) 错误:Access denied for user 'root'@'localhost'" error【摘抄】

    声明:全文均摘抄于MySQL ERROR 1698 (28000) 错误 //错误起源: ~$ mysql -u root -p Enter password: ERROR 1698 (28000): ...

  4. Faster rcnn代码理解(1)

    这段时间看了不少论文,回头看看,感觉还是有必要将Faster rcnn的源码理解一下,毕竟后来很多方法都和它有相近之处,同时理解该框架也有助于以后自己修改和编写自己的框架.好的开始吧- 这里我们跟着F ...

  5. 安装jdk的时候为什么会有两个jre文件

    有些东西,你懂不懂其实并不太影响你干活,但有些人就是有疑惑就非得弄懂,不然浑身难受,我大概就是这种德性的.昨天安装javaSE的时候,看到jdk中有个jre文件夹,而根目录下又有个jre文件夹,非常困 ...

  6. sqlserver2008 链接服务器 2000

    背景 这个项目就有意思了,我用的是sqlserver2008,对方用的是sqlserver2000,还装在windows2000上,是个很老的系统了.两方要对接,对方技术太菜,自己竟然不会转2000. ...

  7. zabbix3.0监控centos当主机cpu使用率超过90%的时候报警

    在windows系统中监控cpu利用率非常容易,自带模板就有这样的功能,但是在linux里面没有默认的模板 只有cpu的负载,默认当cpu的负载在一定时间内5以上报警 cpu utilization中 ...

  8. centos6.5环境搭建openvp服务器及windows客户端搭建及配置详解

    1.环境搭建 说明: vpn client 192.168.8.16/24 openvpn server: eth0: 192.168.8.41 eth1: 172.16.1.10 app serve ...

  9. PYTHON-面向对象 继承 派生

    1. 什么是继承 继承是一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类 继承有3个特点: 1. 子类可以遗传/重用父类的属性(解决类与类之间代码冗余的问题) 2. 在p ...

  10. mysql多线程插入速度与不同数据库之间的比较

    package ThreadInsetMysql;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQ ...