首先抛给大家这样一个问题,给你一个指定的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;
}
}
今天的分享就到这个了哦,有兴趣或者有更多好想法的宝宝们,可以在下面留言讨论哦,大家一起学习。