剑指 Offer 06. 从尾到头打印链表

 

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

 

示例 1:

输入:head = [1,3,2]
输出:[2,3,1]
 

限制:

0 <= 链表长度 <= 10000

 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
        int size;
        int[] array;
        //问题1:java中如何再复制一个引用类型的变量?
        //ListNode p=head;
        //问题2:数组在java中是什么样的存在?为什么可以返回一个数组?
        //Q3:protetive和pubilc的使用
        //Q4:本题定义的类中,ListNode next声明在内存中的位置
        if(head==null)
           return array;
        ListNode p =head-next;
        while(head!=null)
        {

        }


    }
}

有疑惑。关于java中引用数据类型的复制。为什么以下代码可以通过?head和currentNode不是指向同一个对象了吗?currentNode改变head不会也改变吗?

回答:这关于java中的参数传递的机制。java中只有一种传递方式,是值传递,即实际参数值的副本(复制品)传入方法内。和c++有点区别。在方法内如果对复制品赋予了新的地址,即使是引用类型的形参,也不会实际改变参数的值。栈中将会有三个变量,head,实际参数,currNode,同时指向堆中的某个区域,改变currNode并不改变其他变量的指向。具体的讲解在:

 https://blog.csdn.net/javazejian/article/details/51192130?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
       //先获取链表长度,创建对应长度数组
        ListNode currNode = head;//这一步很关键,使得currNode的改变不会影响head
        int len = 0;
        while(currNode != null){
            len ++;
            currNode = currNode.next;
        }
        int[] result = new int[len];
        
        //再次遍历链表,将值倒序填充至结果数组
        currNode = head;
        while(currNode != null){
            result[len - 1] = currNode.val;
            len --;
            currNode = currNode.next;
        }
        return result;

    }
}

 

posted @ 2021-03-04 20:57  wsshub  阅读(53)  评论(0)    收藏  举报