本文参考自《剑指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. Tomcat环境变量,端口号,编码格式,项目路径,默认页的配置

    Tomcat的配置 1.配置环境变量 新建名为:CATALINA_HOME的系统变量,值为我们安装tomcat的目录 2端口号及编码的配置: 找到tomcat安装目录下的sonf下的server文件, ...

  2. 一、linux IO 编程---内存管理

    1.1 进程在虚拟空间中的布局 32位的操作系统虚拟空间的大小为 4GB,即每个进程在系统中分配的虚拟空间大小为4GB.这4GB的大小被分为了两个部分: 内核空间:1GB,内核起的进程 用户空间:3G ...

  3. android ListView使用

    1.DbOpenHelper package dbOpenHelper; import android.content.Context; import android.database.sqlite. ...

  4. QDialog对话框

    QDialog对话框,用来实现那些只是暂时存在的用户界面,是独立的窗口,但通常也有父窗口对话框有模态和非模态两种,,非模态对话框的行为和使用方法都类似于普通的窗口,模态对话框则有所不同,当模态对话框显 ...

  5. Maven私服

    1.关于中央仓库注意事项地址: 目前来说: http://repo1.maven.org/maven2/是真正的 Maven 中央仓库的地址,该地址内置在Maven 的源码中,其他的都是镜像.索引: ...

  6. 如何手动删除服务?Windows手动删除服务列表中残留服务的方法

    https://www.jb51.net/os/windows/267738.html

  7. 三 、 Multivariance Linear Regssion练习(转载)

    转载:http://www.cnblogs.com/tornadomeet/archive/2013/03/15/2962116.html 前言: 本文主要是来练习多变量线性回归问题(其实本文也就3个 ...

  8. Paramiko 操作远端时无法切换目录的问题

    最近在用Paramiko 开发一款远程测试调试框架,结果发现目录怎么都无法切换,查了下原因,在http://bbs.chinaunix.net/thread-1675446-1-1.html看到了 P ...

  9. 深入解析内存原理:DRAM的基本原理

    前面我们知道了在一个简单的SRAM 芯片中进行读写操作的步骤了,然后我们来了解一下普通的DRAM 芯片的工作情况.DRAM 相对于SRAM 来说更加复杂,因为在DRAM存储数据的过程中需要对于存储的信 ...

  10. mysql中文乱码或提示error

    插入一条中文记录: 语句: insert into employee(id,name,job,salary) values(4,'小明','清洁员',1500); 提示: ERROR 1366 (HY ...