赞
踩
一、代码
public class ListNode { ListNode next; int val; public ListNode(int x){ this.val=x; } //将输入的数组输入到链表中 public static ListNode createLinkList(int[] arr){ if (arr.length==0){ return null; } ListNode head=new ListNode(arr[0]); ListNode cur=head; for (int i=1;i<arr.length;i++){ cur.next=new ListNode(arr[i]); cur=cur.next; } return head; } //将链表结果打印 public static void printLinkList(ListNode head){ ListNode cur=head; while (cur!=null){ System.out.printf("%d -> ",cur.val); cur=cur.next; } System.out.println(); } }
测试
@Test
public void testLink(){
int[] arr= {1,2,3,4,5,6,7,8,9,10};
ListNode.printLinkList(ListNode.createLinkList(arr));
}
二、解释
(1)cur=cur.next;为什么head后面会增加?
在链表操作中,cur = cur.next; 这行代码并不直接导致 head 后面“增加”了什么。实际上,head 是一个固定的引用,它始终指向链表的第一个节点(即头节点)。当你看到链表似乎“增长”了,这实际上是因为你通过操作 cur(当前节点的引用)在链表的末尾添加了新的节点。
这里的关键是理解链表是如何通过节点之间的链接(即 next 指针)构建的。每个节点都持有一个对下一个节点的引用(或者为 null,如果它是链表的最后一个节点)。
当你执行 cur.next = new ListNode(arr[i]); 时,你实际上是在告诉当前节点 cur:“你的下一个节点应该是这个新创建的节点。” 然后,通过 cur = cur.next;,你将 cur 的引用更新为新创建的节点,这样 cur 现在就指向了你刚刚添加到链表末尾的节点。
但是,这一切都发生在链表本身,而不是 head 引用。head 始终指向链表的起始位置,不受 cur 移动的影响。
这里是一个简化的示例来说明这一点:
// 假设我们有这样一个链表,并且 head 指向它 // head -> 1 -> null // 让我们假设 cur 最初也指向 head // cur -> 1 -> null // 现在我们添加一个新节点 2 cur.next = new ListNode(2); // 链表变为 head -> 1 -> 2 -> null // 但 cur 仍然指向 1,因为我们还没有更新它 // head -> 1 -> 2 -> null // ^ // | // cur // 现在我们更新 cur 以指向新添加的节点 2 cur = cur.next; // 现在 cur 指向 2 // head -> 1 -> 2 -> null // ^ // | // cur // 如果我们再次添加一个新节点 3 cur.next = new ListNode(3); // 链表现在更长了 // head -> 1 -> 2 -> 3 -> null // ^ // | // cur // 注意:head 从未改变,它始终指向链表的第一个节点
所以,当你看到链表“增长”时,你实际上是在通过更新节点之间的链接(即 next 指针)来扩展链表结构。而 head 引用始终指向链表的起始点,它本身并没有“增加”任何东西;它只是保持了对链表起始节点的引用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。