在做链表分治的题目排序链表时候,注意到其中一个点,让我想不明白。
以前的我认为head赋值给fast和slow了,那就是赋值了一个新的副本。但要区分值类型和引用类型。
如果是实现的类那么是引用类型,赋值后其实引用的是同一块内存地址,如下图创建一个对象再赋值
测试用例
public static void main(String[] args) {
ListNode head = new ListNode(4);
ListNode head1 = new ListNode(2);
ListNode head2 = new ListNode(1);
ListNode head3 = new ListNode(3);
head.next = head1;
head1.next = head2;
head2.next = head3;
ListNode temp = head;
while(temp!=null){
System.out.println("修改前:"+temp.val);
temp = temp.next;
}
ListNode fast = head,slow = head,pre = null;
//寻找中间节点
while(fast!=null&&fast.next!=null){
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
//把中间节点的下一个值赋值为空
pre.next = null;
System.out.println("pre的值:"+pre.val);
while(head!=null){
System.out.println("修改前:"+head.val);
head = head.next;
}
}
结果:
可以发现虽然我们改动的是pre的但head的遍历也变了