java算法:从尾到头打印链表

问题

  • 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

解决

//  1、利用栈输出

        class Solution{
        public int[] reversePrint(ListNode head){
        Stack<ListNode> stack=new Stack<ListNode>();
        while(head!=null){          //这里是head!=null,要将head全部压栈
            stack.push(head);
            head=head.next;
        }
        int len=stack.size();       //size()方法
        int[] arr=new int[len];
        for(int i=0;i<len;i++){
            arr[i]=stack.pop().val;        //这里返回的是栈的值,并且pop()方法是返回栈的最后一个值,不能够加下标
        }
        return arr;
    }
}

//2、 先用链表的数组长度,然后直接从数组最后一个输入,得到取反效果
class Solution {
    public int[] reversePrint(ListNode head) {
        int len=0;
        ListNode cou=head;
        while(cou!=null){
            len++;
            cou=cou.next;
        }                   //链表进行赋值操作以后就会改变,因此需要重新赋值,操作链表尽量不改变原链表
        int[] arr=new int[len];
        cou=head;
        while(cou!=null){
            arr[len-1]=cou.val;
            len--;             //注意这里len要每次减小1!!
            cou=cou.next;
        }
    return arr;

         }   
 }


//3、反转链表实现
class Solution{
public int[] reversePrint(ListNode head){
        ListNode cur=head;
        ListNode pre=null;
        int index=0;

        while(cur!=null){
            ListNode nex=cur.next;          //先将cur后面结点存起来
            cur.next=pre;                   //将当前cur指向上一次结点
            pre=cur;                        //再将以及反转的部分存起来
            cur=nex;                        //将cur存起来的部分重新赋予cur

            index++;
        }

        int[] result=new int[index];
        for(int i=0;i<index;i++){
            result[i]=pre.val;
            pre=pre.next;
        }
        return result;
    }
}

 //4、递归实现
class Solution {
    ArrayList<Integer> list;
    public int[] reversePrint(ListNode head) {
        if(head==null) return new int[0];
        list=new ArrayList<Integer>();
       
        returnRrint(head);
        int size=list.size();
        int[] result=new int[size];

        for(int i=0;i<size;i++){
            result[i]=list.get(i);
        }
        return result;
    }
    public void returnRrint(ListNode head){         //将值存入数组中
        if(head==null) return;
        returnRrint(head.next);
        list.add(head.val);
    }

}

总结

  • 四种方式都可以解决此问题,其中方法2、3耗时较少。并且使用内存较少。
posted @   new_monkey  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示