JZ3 从头到尾打印链表

描述

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

 示例1

输入:{1,2,3}

返回值:[3,2,1]

示例2

输入:{67,0,24,58}

返回值:[58,24,0,67]

单向链表介绍


链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,实现原理是数组。而LinkedList的实现原理就是链表。链表在进行循环遍历时效率不高,但是插入和删除时优势明显。
单向链表是一种线性表,实际上是由节点(Node)组成的,一个链表拥有不定数量的节点。其数据在内存中存储是不连续的,它存储的数据分散在内存中,每个结点只能也只有它能知道下一个结点的存储位置。由N各节点(Node)组成单向链表,每一个Node记录本Node的数据及下一个Node。向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的。

上图中最左边的节点即为头结点(Head),但是添加节点的顺序是从右向左的,也就是尾插。最先添加的节点(Head)对下一节点的引用可以为空。引用是引用下一个节点的地址而非下一个节点的对象。因为有着不断的引用,所以头节点就可以操作所有节点了。
下图描述了单向链表存储情况。存储是分散的,每一个节点只要记录下一节点,就把所有数据串了起来,形成了一个单向链表。

节点(Node)是由一个需要储存的对象(val或者data)及对下一个节点的引用(Node.next)组成的。也就是说,节点拥有两个成员:储存的对象、对下一个节点的引用。下面图是具体的说明:

package com.LeetCodeProblem;
import java.util.ArrayList;

public class JZ3 {
//正常求解
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {

        ArrayList<Integer> temp = new ArrayList<>();
        ArrayList<Integer> res = new ArrayList<>();//创建临时list和结果list
        while (listNode!=null){
            temp.add(listNode.val);
            listNode=listNode.next;
        }
        //反转赋值
        for (int i = temp.size();i>=0 ; i--) {
            res.add(temp.get(i));
        }
        return res;
    }

package com.LeetCodeProblem;
import java.util.ArrayList;


    //利用递归
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {

    ArrayList<Integer> res = new ArrayList<>();
    if(listNode!=null) {
        res.addAll(printListFromTailToHead(listNode.next));
        res.add(listNode.val);
    }
    return res;

}
package com.LeetCodeProblem;
import java.util.ArrayList;
import java.util.Stack;


//利用栈先入后出的特性实现反转数据顺序

    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        Stack<Integer> temp = new Stack<>();
        ArrayList<Integer> newList = new ArrayList<>();
        ListNode t = listNode;//这里不创建t,直接用listNode也行

        while( t != null ){

            temp.push(t.val);
            t = t.next;
        }
        while( !temp.empty() ){
            newList.add(temp.pop());
        }
        return newList;
    }


    public class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值