剑指Offer(6)从尾到头打印链表

目录

从尾到头打印链表

描述

示例1

示例2

说明

方法一:翻转列表

方法二:Java的方法

方法三:递归


从尾到头打印链表

描述

输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。

如输入{1,2,3}的链表如下图:

返回一个数组为[3,2,1]

0 <= 链表长度 <= 10000

示例1

输入:

{1,2,3}

返回值:

[3,2,1]

示例2

输入:

{67,0,24,58}

返回值:

[58,24,0,67]

说明

链表的数据结构如下:

public class ListNode {
    public int val;
    public ListNode next;
    public ListNode(int x) {
        val = x;
        next = null;
    }
}

方法一:翻转列表

一开始想到的方法是反转列表,没想到挺慢的,问题想复杂了,

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list=new ArrayList<>();
        ListNode head=listNode;
        if (listNode==null){
            return list;
        }else if (listNode.next==null){
            list.add(listNode.val);
            return  list;
        }else{
            ListNode pre=null;
            ListNode cur=head;
            ListNode next=head.next;
            while(cur!=null){
                cur.next=pre;
                if (next!=null){
                    pre=cur;
                    cur=next;
                    next=next.next;
                }else{
                    break;
                }
            }

            while(cur!=null){
                list.add(cur.val);
                cur=cur.next;
            }
            return list;
        }
    }
}

方法二:Java的方法

ArrayList. add(index,value)可以将值插入到指定位置,所以利用这个特性,我们遍历链表,将每个节点元素插到第一个位置就可以实现倒置(tips:利用String的reverse函数或者栈的出栈顺序也可以达到类似的效果)

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

方法三:递归

递归的思路和深度优先搜索类似,先到最后一个节点,然后依次添加元素并将集合返回。

import java.util.ArrayList;
public class Solution {
    ArrayList list = new ArrayList();
    public ArrayList printListFromTailToHead(ListNode listNode) {
        if(listNode!=null){
            printListFromTailToHead(listNode.next);
            list.add(listNode.val);
        }
        return list;
    }
}

 不过递归的栈空间消耗过大,数组元素过多系统直接没给过。

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/120454985