在做链表分治的题目排序链表时候,注意到其中一个点,让我想不明白。
以前的我认为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的遍历也变了