1.用栈来实现,先把listnode.val全部放进自己的栈里,然后打印栈的值
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> temp = new Stack<Integer>();
ArrayList<Integer> list = new ArrayList<Integer>();
while(listNode!=null){
temp.push(listNode.val);
listNode = listNode.next;
}
while(!temp.isEmpty()){
list.add(temp.pop());
}return list;
}
}
对于剑指offer给出的另外一种递归思路;我先用Python实现了
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
class Solution(object):
def printListFromTailToHead(self, listNode):
if (listNode != None):
if (listNode.next != None):
return self.printListFromTailToHead(listNode.next) +[listNode.val]
if (listNode.next == None):
return [listNode.val]
else:
return []
t = ListNode(2)
L = t
L.next=ListNode(1)
L=L.next
L.next = ListNode(3)
L = L.next
L.next = ListNode(4)
L = L.next
L.next = ListNode(4)
S = Solution()
print S.printListFromTailToHead(t,[])
不难发现,这是一个递归思路,我们可以把这题看成两部分,递归思路无非是分解子问题和递归出口;首先,第一部分第一个节点用listNode.val表示,第二部分是拍好序的后n-1个节点,我们的printListFromTailToHead(listNode)是逆序整个链表,那么逆序后面n-1个节点就是printListFromTailToHead(listNode.next),把第一个的llistnode节点插入尾部就可以啦!其次,当链表遍历到最后一个节点,此时listnode.next = None,问题的状态发生了变化,那么递归出口就是最后一个节点这里;
下面是用java实现:
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> tmp = new ArrayList<Integer>();
if(listNode!=null){
if(listNode.next != null){
tmp = this.printListFromTailToHead(listNode.next);
tmp.add(listNode.val);
return tmp;
}
else {
tmp.add(listNode.val);
return tmp;
}
}
else {return tmp;}
}
}
建议打个完整到ecplise里感受一下:
import java.util.ArrayList;
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution2 {
public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> tmp = new ArrayList<Integer>();
if(listNode!=null){
if(listNode.next != null){
tmp = printListFromTailToHead(listNode.next);
tmp.add(listNode.val);
return tmp;
}
else {
tmp.add(listNode.val);
return tmp;
}
}
else {return tmp;}
}
public static void main(String args[]) {
ListNode t =new ListNode(2);
ListNode L = t;
L.next=new ListNode(1);
L=L.next;
L.next =new ListNode(3);
L = L.next;
L.next =new ListNode(4);
L = L.next;
L.next =new ListNode(4);
L = L.next;
ArrayList<Integer> res = printListFromTailToHead(t);
System.out.println(res);
}
}