在一些编程场景中,我们常常需要记录下某一个特殊的实例位置(如BST转双向链表题中需要记录最终生成的链表的头节点)。
在使用Java编程过程中,需要注意引用的问题。
class ListNode { public int val; public ListNode next; public ListNode(int _val) { val = _val; } } public class PointerTestInJava { public static void main(String[] args) { ListNode node1 = new ListNode(1); ListNode node2 = null; pointerTest(node1, node2); if (node2 == null) { System.out.println("node2 is still null!"); } else { System.out.println(node2.val); } } public static void pointerTest(ListNode node1, ListNode node2) { node2 = node1; } }
打印结果如下:
node2 is still null!
显然pointerTest方法并不能将node1指向node2,作如下的改变:
public class PointerTestInJava { public static void main(String[] args) { ListNode node1 = new ListNode(1); ListNode node2 = new ListNode(2); pointerTest(node1, node2); if (node2.next == null) { System.out.println("node2.left is null!"); } else { System.out.println("node2.next is " + node2.next.val); } } public static void pointerTest(ListNode node1, ListNode node2) { node2.next = node1; } }
打印结果:
node2.next is 1
此时,node1.left指向了node2. 原因是可把node1.left看做是一个指针。