You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套双while循环打印链表元素的困惑及修正方法

链表遍历问题解答

问题背景

现有两个链表,每个节点包含data1、data2两个数据:

  • list1:(1,1) → (2,2)
  • list2:(3,3) → (4,4) → (5,5)
    (括号代表单个节点)

执行以下C代码:

while (list2 != NULL)
{
    while (list1 != NULL)
    {
        printf("list1 contains : %d, %f\n", list1->data1, list1->data2);
        list1 = list1->NextNode;
    }

    printf("list2 contains : %d, %f\n", list2->data1, list2->data1);
    list2 = list2->NextNode;
}

原本预期打印顺序:

list1, list1, list2, list1, list1, list2, list1, list1, list2

实际打印顺序:

list1, list1, list2, list2, list2.


1. 为什么预期会失败?

问题出在list1的指针没有复位。第一次外层循环(遍历第一个list2节点)时,内层while循环会把list1从表头一直遍历到尾节点的下一个位置(也就是NULL)。之后的外层循环里,list1已经是NULL了,内层while循环直接跳过,只会执行list2的打印语句,所以只会再输出两次list2,不会重复遍历list1。

2. 如何修改代码实现预期效果?

核心是每次外层循环开始前,把list1重置回它的原始表头节点。需要先定义一个临时指针保存list1的头地址,避免遍历过程中丢失表头。

修改后的代码如下:

// 先保存list1的表头指针
Node* list1_head = list1;
while (list2 != NULL)
{
    // 每次外层循环开始时,把list1重置回表头
    list1 = list1_head;
    while (list1 != NULL)
    {
        printf("list1 contains : %d, %f\n", list1->data1, list1->data2);
        list1 = list1->NextNode;
    }

    // 修正原代码的小错误:第二个参数改为list2->data2
    printf("list2 contains : %d, %f\n", list2->data1, list2->data2);
    list2 = list2->NextNode;
}

另外注意原代码的一个小bug:打印list2时,第二个参数误写为list2->data1,改成list2->data2才符合节点数据的打印逻辑。


内容的提问来源于stack exchange,提问作者bFur4list

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:05:12