【链表在Java中DeBug】

一、代码

java 复制代码
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();
    }
}

测试

java 复制代码
    @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 移动的影响。

这里是一个简化的示例来说明这一点:

java 复制代码
// 假设我们有这样一个链表,并且 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 引用始终指向链表的起始点,它本身并没有"增加"任何东西;它只是保持了对链表起始节点的引用。

相关推荐
wbs_scy28 分钟前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
jiushiapwojdap2 小时前
LU分解法求解线性方程组Matlab实现
数据结构·其他·算法·matlab
jinanwuhuaguo2 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup3 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
纽扣6673 小时前
【算法进阶之路】链表进阶:删除、合并、回文与排序全解析
数据结构·算法·链表
952363 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.3 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19433 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心12213 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px3 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋