剑指offer-面试题5-1 从尾到头打印链表
题目:输入一个链表(的头结点),从尾到头反过来打印出每个结点的值。
【注】:这里实现的链表由于结点是内部类,无法直接传递进入reverse()方法,我决定直接传入整个链表,虽然也实现了题目效果,但仍不够严谨。所以在第二种方法中我们会写一个简单的内部类Node 以契合实现题目要求。详请参见剑指offer-面试题5-2 从尾到头打印链表。
思路:
本题考查的是数据结构中的链表操作。
单链表的性质之一:每个结点只有后继结点的信息,无法通过结点自带的信息找到前驱结点。那如何实现题目要求的功能呢?
通过思考,我们发现栈这种数据结构正好能够满足这道题的要求。因为栈正好是后进先出(Last In First Out, 简称为LIFO)的。那么我们用栈来实现这道题目。
链表的数据结构的Java实现:Java实现链表数据结构。
栈的数据结构Java实现:Java实现栈数据结构。
不多说,看代码:
代码:
package swordOffer;
import linearlist.LinkList;
import stack.*;
/**
* 这是剑指offer的第二题:
* 输入一个链表,从尾到头反过来打印出每个结点的值。
* @author Stephen Huge
*/
public class Ex05ReverseLinkList {
public static void main(String[] args) {
LinkList<String> list = new LinkList<String>("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
System.out.println(list.toString());
LinkStack<String> reverse = reverseLinkList(list);
System.out.println(reverse.toString());
}
/**
* 一个利用栈反转链表的方法。
* @param list 要反转的链表
* @return 反转之后得到的链栈
*/
public static LinkStack<String> reverseLinkList(LinkList<String> list) {
if(list.isEmpty()) {
return null;
}else{
LinkStack<String> temp = new LinkStack<String>();
String next;
for(int i = 0; i < list.length(); i++) {
next = list.get(i);
if(next != null) {
temp.push(next);
}
}
return temp;
}
}
}
运行结果:
[aaa, bbb, ccc, ddd]
Top[ddd, ccc, bbb, aaa]Buttom
代码逻辑十分简单,就是简单的将链表的每个结点入栈,然后将栈打印出来。其中导入的两个包都是在上面链接里存在的。
参考文章:http://blog.csdn.net/tayanxunhua/article/details/11100097/。