只有我的"链接列表"中的第一个节点正在打印



我正在尝试建立一个基本的链表。 我用不同的值调用函数 appendNode(( 四次,只有一个打印到屏幕上。 如何打印所有四个? 它是如何卡在第一个的?

void NumberList::appendNode(double num)
{
ListNode *newNode;
ListNode *nodePtr;
newNode = new ListNode; //allocating memory .
newNode->value = num;
newNode->next = NULL;
//no nodes, so this becomes the head.
if (!head) //if not null or zero.  so if it returns anything BUT zero, this statement executes.
head = newNode; //the head is now pointing to the newly created newNode.
else // so the last newNode has already been set to the head and now we're at this statement.
{
nodePtr = head; // assigning the next node to the head, also the same address of that first node.
while (nodePtr->next) //moving passed anything with a NULL until it reaches somthing Other than NULL.
{
nodePtr = nodePtr->next;
//insertion at the end.
nodePtr->next = newNode;
}   
}
}
void NumberList::displayNode()
{
ListNode *nodePtr; // for traversing
nodePtr = head;
while (nodePtr)
{
cout << nodePtr->value << endl;
nodePtr = nodePtr->next;
}
}

如果列表中存在现有元素,则"追加到末尾"逻辑不正确。您每次都在尝试在循环中附加newNode

当到达末尾时,才需要追加:

if(!head)
head = newNode;
else
{
nodePtr = head;
while (nodePtr->next) 
{
nodePtr = nodePtr->next;
}   
//insertion at the end. (outside the loop)
nodePtr->next = newNode;
}

head不为 NULL 时,您在错误的位置执行nodePtr->next = newNode;。 将第一个节点添加到列表中以设置head后,在随后的添加中head不是 NULL,而是head->nextNULL 因此永远不会进入循环以将newNode添加到列表中,因此列表不会增长,并且您泄漏了新节点。 因此,在以后迭代非空列表(例如用于打印(时,head->next始终为 NULL,因此仅处理head节点。

nodePtr->next = newNode;语句需要在循环找到列表中的最后一个节点之后执行,而不是在循环查找最后一个节点执行:

void NumberList::appendNode(double num)
{
ListNode *newNode = new ListNode; //allocating memory
newNode->value = num;
newNode->next = NULL;
if (!head)
head = newNode;
else
{
ListNode *nodePtr = head;
while (nodePtr->next)
{
nodePtr = nodePtr->next;
}   
nodePtr->next = newNode;
}
}

话虽如此,代码可以大大简化,因此您根本不需要将逻辑分成 2 个分支:

class ListNode
{
public:
double value;
ListNode *next;
ListNode(double num) : value(num), next(NULL) {}
};
void NumberList::appendNode(double num)
{
ListNode **nodePtr = &head;
while (*nodePtr) {
nodePtr = &((*nodePtr)->next);
}
*nodePtr = new ListNode(num);
}

相关内容

  • 没有找到相关文章

最新更新