剑指offer5从尾到头打印链表java

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值