剑指 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并不改变其他变量的指向。具体的讲解在:
/** * 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; } }

浙公网安备 33010602011771号