从尾到头打印链表
使用九度OJ http://ac.jobdu.com/problem.php?pid=1511
题目1511:从尾到头打印链表
剑指offer面试题5
从尾到头打印一个链表,就是逆序的意思了,提到逆序,第一反应就是使用栈,既然可以使用栈,那么也可以往递归这个思路上去想。下面是使用C+++编程实现这道题目,使用了上面提到的两个思路。
// 使用C++编程语言实现
class Solution {
public:
// 解法1:使用递归来实现逆序打印链表
void printReverseListRecursly(ListNode* head) {
if (NULL == head) {
return;
}
printReverseListRecursly(head->next);
printf("%d\n", head->val);
}
/**************************************************************
Problem: 1511
User: buptxxz
Language: C++
Result: Accepted
Time:90 ms
Memory:5028 kb
****************************************************************/
// 解法2:使用栈来实现逆序打印链表
void printReverseListWithStack(ListNode* head) {
stack<int> stk;
ListNode* p = head;
while (NULL != p) {
stk.push(p->val);
p = p->next;
}
while (!stk.empty()) {
printf("%d\n", stk.top());
stk.pop();
}
}
/**************************************************************
Problem: 1511
User: buptxxz
Language: C++
Result: Accepted
Time:90 ms
Memory:4484 kb
****************************************************************/
};
int main() {
ListNode* dummy = new ListNode(-1);
ListNode* p = dummy;
int x = 0;
while (scanf("%d", &x) != EOF && -1 != x) {
ListNode* curNode = new ListNode(x);
p->next = curNode;
p = p->next;
}
Solution M;
M.printReverseListWithStack(dummy->next);
return 0;
}
除了上述使用c++实现外,还试了试java,下面是java的代码。
import java.util.Scanner;
import java.util.Stack;
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; next = null;}
}
public class Main {
/**
* 使用栈的方式
* @param head
* 切记,java容器类看起来很美,然而在用的时候非常的慢
*/
private void printReverseListWithStack(ListNode head) {
Stack<Integer> stack = new Stack<Integer>();
ListNode p = head;
while (null != p) {
stack.push(p.val);
p = p.next;
}
while (!stack.empty()) {
System.out.println(stack.pop());
}
}
/**************************************************************
Problem: 1511
User: buptxxz
Language: Java
Result: Time Limit Exceed
****************************************************************/
/**
* 使用递归的方式
* @param head
* 当数据量比较大的时候,递归层数过多,将导致栈溢出,进而显示Runtime Error
*/
private void printReverseListRecursly(ListNode head) {
if (null == head) {
return;
}
printReverseListRecursly(head.next);
System.out.println(head.val);
}
/**************************************************************
Problem: 1511
User: buptxxz
Language: Java
Result: Runtime Error
****************************************************************/
/**
* 使用数组来模拟一个栈
* @param head
* 使用数组模拟一个栈,需要先遍历链表,求出链表的大小,相当于多遍历了一遍链表。然而由于没有使用容器类,依然速度较快。
*/
private void printReverseListFast(ListNode head) {
ListNode p = head;
int n = 0;
while (null != p) {
p = p.next;
++n;
}
int[] list = new int[n];
p = head;
for (int i = 0; null != p; ++i, p = p.next) {
list[i] = p.val;
}
for (int j = n - 1; j >= 0; --j) {
System.out.println(list[j]);
}
}
/**************************************************************
Problem: 1511
User: buptxxz
Language: Java
Result: Accepted
Time:2950 ms
Memory:109204 kb
****************************************************************/
public static void main(String[] args) {
ListNode dummy = new ListNode(-1);
ListNode p = dummy;
Scanner cin = new Scanner(System.in);
Main M = new Main();
int x = 0;
while (cin.hasNext() && (x = cin.nextInt()) != -1) {
p.next = new ListNode(x);
p = p.next;
}
cin.close();
M.printReverseListFast(dummy.next);
}
}