我正在尝试建立一个基本的链表。 我用不同的值调用函数 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->next
NULL 因此永远不会进入循环以将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);
}