剑指offer(06)-从尾到头打印链表

题目描述

输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
在这里插入图片描述

牛客链接

本题牛客链接

解题思路一

可以使用stack的方式,但是这种方法会存在占用空间过大的问题
先创建一个栈,然后依次从头到尾循环将链表中的节点元素入栈,再创建一个数组集合,利用栈先进后出的特点将栈中的元素分别出栈添加到数组集合中,return 数组集合。

解题代码一

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.*;
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        //先创建一个栈
        Stack<Integer> st = new Stack<>();
        //依次将链表中节点的元素入栈
        while(listNode != null){
            st.push(listNode.val);
          listNode =   listNode.next;
        }
        //创建一个数组集合
        ArrayList<Integer> list = new ArrayList<>();
        while(!st.empty()){
            //将弹出的元素放入数组集合类中
            list.add(st.pop());
        }
        return list;
    }
}

解题思路二

首先创建一个数组集合,将链表中的元素依次放入数组集合中,然后将数组中的元素进行逆置,再return 逆置后的数组集合。

解题代码二

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.*;
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
       //先创建一个数组集合
        ArrayList<Integer> list = new ArrayList<>();
        while(listNode != null){
            list.add(listNode.val);
            listNode = listNode.next;
        }
        //然后将数组集合中的元素进行逆置
        int i = 0;
        int j = list.size()-1;
        while(i < j){//i逐渐从0增大,j逐渐从尾部减小,对应交换,当两者相等碰头结束,不再进入交换循环
            int temp = list.get(i);//首先将头部元素放入临时位置
            list.set(i,list.get(j));//将尾部元素放入头部元素
            list.set(j,temp);
            i++;
            j--;
        }
        return list;
    }
}

解题思路三

采用递归的方式,这种方式在牛客中容易出现数组越界,不建议使用

解题代码三

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.*;
import java.util.ArrayList;
public class Solution {
    public void printListFromTailToHeadHelper(ListNode listNode,ArrayList<Integer> list) { 
        if(listNode == null){ //这个是递归终点的地方
            return; 
        }
        printListFromTailToHeadHelper(listNode.next,list); //一步一步往下去,list先从后面往前add
        list.add(listNode.val); 
    }
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        //先创建一个数组集合
        ArrayList<Integer> list = new ArrayList<>();
        //递归的时候用下面的函数进行递归
        printListFromTailToHeadHelper(listNode,list);
        return list;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值