Andy Back-end Dev Engineer

剑指offer-从尾到头打印链表

2018-06-25

题目描述 输入链表的第一个节点,从尾到头反过来打印出每个结点的值。

解体思路

1.使用栈Stack

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        Stack<Integer> stack = new Stack<>();
        while(listNode != null) {
            stack.add(listNode.val);
            listNode = listNode.next;
        }
        
        ArrayList<Integer> list = new ArrayList<>();
        while(!stack.isEmpty()) {
            list.add(stack.pop());
        }
        return list;
    }
}

2.使用递归,时间复杂度较大

ArrayList<Integer> list = new ArrayList<>();
        while(listNode != null) {
            list.addAll(printListFromTailToHead(listNode.next));
            list.add(listNode.val);
        }
        return list;

3.使用Collections的reverse方法

ArrayList<Integer> list = new ArrayList<>();
        while(listNode != null) {
            list.add(listNode.val);
            listNode = listNode.next;
        }
        Collections.reverse(list);
        return list;

4.使用链表头插法

ListNode head = new ListNode(-1);
        while(listNode != null) {
            ListNode min = listNode.next;
            listNode.next = head.next;
            head.next = listNode;
            listNode = min;      
        }
        
        ArrayList<Integer> list  = new ArrayList<>();
        head = head.next;
        while(head != null) {
            list.add(head.val);
            head = head.next;
        }
        return list;

Comments

Content