单链表main函数中调用打印函数无输出,反而在初始化函数中调用打印函数有输出

/**
*给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
*请你将两个数相加,并以相同形式返回一个表示和的链表。
*你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
*/
#include <iostream>
#include<time.h>
using namespace std;
struct ListNode
{
	int val;
	ListNode* next;
	ListNode() :val(0), next(nullptr) {}
	ListNode(int x) :val(x), next(nullptr) {}
	ListNode(int x, ListNode* next) :val(x), next(next) {}
};
//函数声明
void initListNode(ListNode*, ListNode*); //列表初始化
void printfListNode(ListNode* listNode);//列表打印输出

class Solution {
public:
	ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

	}
};
int main()
{
	Solution solution;
	//solution.addTwoNumbers();
	ListNode* l1 = nullptr, * l2 = nullptr;
	initListNode(l1, l2);  //单链表初始化数据
	printfListNode(l1);  //********这里打印不出结果,反而在初始化函数中可以打印结果出来*******
	//printfListNode(l2); 
	return 1;
}

//单链表初始化
void initListNode(ListNode* head1, ListNode* head2) {
	ListNode *nextNode1 = nullptr, * nextNode2 = nullptr;
	srand(time(NULL));
	for (int i = 0; i < 3; i++)
	{
		int a = rand() % 9 + 1;
		int b = rand() % 9 + 1;
		cout << "a=" << a << ",b=" << b << endl;
		if (i == 0) 
		{
			head1 = new ListNode(a, nullptr);
			head2 = new ListNode(b, nullptr);
			nextNode1 = head1;
			nextNode2 = head2;
		}
		else
		{
			nextNode1->next = new ListNode(a, nullptr);
			nextNode2->next = new ListNode(b, nullptr);
			nextNode1 = nextNode1->next;
			nextNode2 = nextNode2->next;
		}
	}
	//printfListNode(head1); ********单链表在这里就可以打印出结果来
	//printfListNode(head2);
}
//单链表打印输出
void printfListNode(ListNode* listNode)
{
	while (listNode)
	{
		cout << listNode->val << " ";
		listNode = listNode->next;
	}
	cout << endl;
}

 

参考GPT和自己的思路:

问题出在initListNode函数的参数传递上。由于传递的是指针的值,因此在函数内部修改指针的指向并不会影响到main函数中的指针。

正确的做法是使用引用传递,即将函数声明改成:

void initListNode(ListNode*& head1, ListNode*& head2);

这样,在函数内部修改指针的指向就可以正确地影响到main函数中的指针了。