从尾到头打印链表

1年前 (2022) 程序员胖胖胖虎阿
158 0 0

输入一个链表,按链表从尾到头的顺序返回一个ArrayList

解法一:最简单的想法,先排序,再逆序

import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> integerList = new ArrayList<>();
 
        while (listNode != null) {
            integerList.add(listNode.val);
            listNode = listNode.next;
        }
        // 不想调用库函数也行,自己写一个叭
        Collections.reverse(integerList);
        return integerList;
    }
}

解法二:借助栈先进后出的原理,辅助实现逆序

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

解法三:使用递归思想,递归其实也类似于栈的调用

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;
    }
}

解法四:使用头插法实现

对于 ArrayList 来说,数组元素移动的开销太大,不建议使用,但思路是不错的

public class Solution {
    private ArrayList<Integer> list = new ArrayList<>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        while(listNode != null) {
            list.add(0, listNode.val);
            listNode = listNode.next;
        }
        return list;
    }
}

小结:涉及到逆序问题,可以往以下方面考虑

  • 借助栈先进后出的特点
  • 递归也可以实现栈的作用
  • 头插法是把新结点插入首部,其余结点往后退,也是一个值得考虑的方案

版权声明:程序员胖胖胖虎阿 发表于 2022年11月13日 下午10:40。
转载请注明:从尾到头打印链表 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...