我用了四种解法,全部都可以在牛客网上通过。
第一种解法是最简单的,新建两个ArrayList,一个是正常顺序的,另一个是原来的数据的倒序;
第二种解法是在在一个ArrayList中进行倒序;
第三种解法是运用链表本身的性质将链表翻转过来;
第四种解法是使用栈来处理。java代码如下:
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.*;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//提取数据放到数组中时是从头到尾打印,所以得做出倒序
/*
//第一种和第二种方法用到
ListNode ln = listNode;
ArrayList<Integer> arrayList = new ArrayList<Integer>();
while(ln != null){
arrayList.add(ln.val);
ln = ln.next;
}*/
//第一种,新建两个ArrayList,然后存储原来的数据的倒序
/*int length = arrayList.size() - 1;
ArrayList<Integer> newArrayList = new ArrayList<Integer>();
for(;length >= 0;length--){
newArrayList.add(arrayList.get(length));
}
return newArrayList;
*/
//第二种,在原ArrayList中进行倒序
/* for(int i = 0;i < arrayList.size()/2;i++){
int tval = arrayList.get(i);
arrayList.set(i,arrayList.get(arrayList.size() - i - 1));
arrayList.set(arrayList.size() - i - 1,tval);
}
return arrayList;
*/
//第三种,运用链表本身的性质将链表翻转过来
/*ListNode ln = convertListNode(listNode);
ArrayList<Integer> arrayList = new ArrayList<Integer>();
while(ln != null){
arrayList.add(ln.val);
ln = ln.next;
}
return arrayList;
*/
//第四种,由于需要倒序,跟栈先入后出相应,所以也可以用栈来处理
ListNode ln = listNode;
Stack<Integer> stack = new Stack<Integer>();
ArrayList<Integer> arrayList = new ArrayList<Integer>();
while(ln != null){
stack.push(ln.val);
ln = ln.next;
}
while(!stack.empty()){
arrayList.add(stack.pop());
}
return arrayList;
}
public static ListNode convertListNode(ListNode listNode){
if(listNode == null){
//当链表为空时
return null;
}
if(listNode.next == null){
//当链表只有一个节点时
return listNode;
}
ListNode tail = listNode;
ListNode tListNode1 = listNode;
ListNode tListNode2 = listNode.next;
while(tListNode2 != null){
tail.next = tListNode2.next;
tListNode2.next = tListNode1;
tListNode1 = tListNode2;
tListNode2 = tail.next;
}
return tListNode1;
}
}