嵌套双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
相关产品推荐
相关产品推荐

