将一个链表进行从尾到头的输出的三种方式

首先抛给大家这样一个问题,给你一个指定的ListNode,然后进行从尾到头的放入一个LinkedList并进行输出,你有什么思路吗?

   public class ListNode {
        int val;
       ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
   }
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
      //进行数据操作。。。。。
    }

你看到这个方法的参数和返回值信息之后,有什么思路吗?
也许你可能会想到从尾到头进行输出,那可不可以使用 【先进后出】这个数据结构呢?如果将这个ListNode放入栈中,然后进行一个一个输出栈中的数据,就可以达到这个需求了。
这样子当然可以了,下面请看代码

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

        ArrayList<Integer> list = new ArrayList<>();
        while (!stack.isEmpty()) {
            list.add(stack.pop());
        }
        return list;       
    }
}

在这个代码中,使用 while 进行循环将 ListNode 中的数据全部放入到一个栈中,判断的条件就是 listNode.next 为null,即到了最后一个数。

在栈中,push的数据会全部放入到了栈底,使用pop将栈顶的数据拿出,全部放入到要LinkedList中,进行输出。这个方法很棒。


换一个思路呢,给大家一个提示,大家都知道 LinkedList 可以构造栈的特性,那如果不使用 Stack ,该怎么做呢?

现在给出大家一个这样子的代码

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> array=new ArrayList<Integer>();
        ListNode p=n;
        change(array,n);
        return array;
    }
    public void change(ArrayList<Integer> array,ListNode listNode){
        if(listNode!=null){
            change(array,listNode.next);
             al.add(listNode.val);
        }
    }
}

这个代码块里面 change 方法使用递归将数据按照顺序放入了ArrayList集合里面,当然也可以直接在一个方法里面使用循环放入进去,就和第一种方法换汤不换药。

不知道大家看到递归这个方法之后,对这个问题有什么新的看法吗?

如果直接使用递归呢,下面给出我个人最钟爱的一个方法

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    private ArrayList<Integer> re = new ArrayList<Integer>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
       if(listNode==null)
           return re;
        printListFromTailToHead(listNode.next);
        re.add(listNode.val);
        return re;
    }
}

今天的分享就到这个了哦,有兴趣或者有更多好想法的宝宝们,可以在下面留言讨论哦,大家一起学习。

猜你喜欢

转载自blog.csdn.net/weixin_42636552/article/details/82220033