如何在C++中将数字转换为链表

How to convert a number to a linked list in C++

本文关键字:数字 转换 链表 C++      更新时间:2023-10-16

我开始学习链表,并试图解决一个编程问题。输出需要是一个表示为链表的数字。例如,如果数字为 123,则链表需要为 3->2->1。

根据我的实现,我正在事先执行所有其他功能,并将最终的输出编号作为 int,并且需要将其转换为链表。我尝试了以下代码。

ListNode* numToLL(int sum){
ListNode* mainHead;
int remainder = sum % 10;
mainHead->val = remainder;
sum = sum / 10;
ListNode* head;
head = mainHead;
while (sum != 0){
ListNode* nextNode;
int remainder = sum % 10;            
nextNode->val = remainder;
head->next = nextNode;
head = nextNode;
sum = sum / 10;
}
return mainHead;
}

我知道这是不正确的,但我不确定如何纠正它。此错误消息在函数内部的第 3 行显示:"运行时错误:类型为'struct ListNode'的空指针内的成员访问"。

这应该可以修复您当前的错误,不能保证没有其他错误。 :)做自己的功课

ListNode* mainHead;更改为ListNode* mainHead = new ListNode();将为类类型 ListNode 的实例化分配内存,并返回分配给您声明的指针变量的内存地址。

如果没有此更改,您的 mainHead 变量包含一个可能指向任何内容的未知值。 从您的错误来看,它包含与 NULL 相同的值,但这不能保证。

同样的事情也适用于ListNode* nextNode;->ListNode* nextNode = new ListNode();

ListNode* numToLL(int sum){
ListNode* mainHead = new ListNode();
int remainder = sum % 10;
mainHead->val = remainder;
sum = sum / 10;
ListNode* head;
head = mainHead;
while (sum != 0){
ListNode* nextNode = new ListNode();
int remainder = sum % 10;            
nextNode->val = remainder;
head->next = nextNode;
head = nextNode;
sum = sum / 10;
}
return mainHead;
}

mainHeadnextNode都是未初始化的。 在访问其val字段之前,您没有为其分配有效的ListNode对象以供它们指向。

此外,您正在循环上方和内部重复相同的代码。 在编写代码时遵循 DRY 原则("不要重复自己"(是个好主意,随着时间的推移,它更容易维护。

在不重复代码的情况下在循环中填充链表的一个常见习惯用法是使用额外的间接寻址级别 - 指向等待分配的下一个ListNode*指针的指针。 例如:

ListNode* numToLL(int sum)
{
ListNode* theList = NULL;
ListNode** node = &theList;
do
{
*node = new ListNode;
(*node)->val = sum % 10;
(*node)->next = NULL;
node = &((*node)->next);
sum /= 10;
}
while (sum != 0);
return theList;
}

现场演示