剑指offer 面试题5 : 从尾到头打印链表
题目:
输入一个链表的头结点,从尾到头反过来打印出每个节点的值。链表结点定义如下:
struct ListNode {
int m_nKey;
ListNode* m_pNext;
};
思路:
通常打印是一个只读操作,我们不希望打印时修改内容,所以这个题目在遍历过程中,不能修改链表的值。逆序打印链表,操作正好符合堆栈的数据结果。
Java代码实现:
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public static void main(String[] args) {
ListNode listNode = new ListNode(1);
ListNode root = listNode;
for (int i = 2; i < 5; i++) {
listNode.next = new ListNode(i);
listNode = listNode.next;
}
new Solution().printListFromTailToHead(root);
new Solution().printListFromTailToHead2(root);
}
/**
* 非递归实现,借助于栈的数据结构
*
* @param listNode
* @return
*/
public void printListFromTailToHead(ListNode listNode) {
Stack<Integer> stack = new Stack<Integer>();
ListNode root = listNode;
while (root != null) {
stack.push(root.val);
root = root.next;
}
while (!stack.empty()) {
System.out.print(stack.pop() + " ");
}
System.out.println("");
}
/**
* 递归实现方式
*
* @param listNode
* @return
*/
public void printListFromTailToHead2(ListNode listNode) {
if (listNode != null) {
if (listNode.next != null) {
printListFromTailToHead2(listNode.next);
}
System.out.print(listNode.val + " ");
}
}
}
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
加油

浙公网安备 33010602011771号