剑指offer-3 从尾到头打印链表 -- Java实现

题目

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
牛客网给定以下链表类。

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/

分析

思路1:

因题目给定的是链表,我们只能从头到尾去遍历,可是题目却要求逆序输出并返回一个ArrayList。举例来说就是例如当开始遍历第一个链表结点时,我们需要把该结点的值放到最后一个去输出。相应的,遍历到第二个结点时,需把该结点的值放到倒数第二个输出,后面依次类推。可以明显发现符合栈的“先进后出”的原则。所以对目标输出的数据结构应构造为栈的这种形式。

步骤:

1)判断当前链表结点是否非空;
2)若非空,就将当前结点值添加到数组列表的第一个位置;
3)返回1)继续判断,直到结束循环,返回数组列表。

代码:

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList();
        ListNode tmp = listNode;
        while(tmp != null){
            list.add(0,tmp.val);
            tmp = tmp.next;
        }
        return list;
    }
}

思路2:

采用递归的思路。按照递归三要素进行分析。首先,函数实现的功能是逆序打印链表的值;其次,递归头为链表结点为空;最后递归体,即只要当前遍历结点非空,就返回去继续递归,直到结点为空,结束递归,将最后一个结点的值添加到list里,依次往上回溯,实现逆序添加结点值。

注意:此处所说的循环应用if实现,而非while,否则会无限添加最后一个结点的值。具体可以自己debug查看。

步骤:

1)在递归函数外创建一个空列表ArrayList(注意是函数外,否则会一直重新创建列表);
2)只要当前结点非空,就继续递归到下一个结点;
3)直到结点为空,结束递归,向上回溯,即从最后一个结点开始逐次添加到列表里。

代码:

import java.util.ArrayList;
public class Solution {
	ArrayList<Integer> list = new ArrayList();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode != null){
			printListFromTailToHead(listNode.next);
			list.add(listNode.val);
		}
		return list;
    }
}
发布了46 篇原创文章 · 获赞 17 · 访问量 1045

猜你喜欢

转载自blog.csdn.net/weixin_42054926/article/details/103043874