C++链表插入节点,上一个节点初始化

问题描述

我正在看我的 C++ 教科书,里面有一个链接列表函数的例子,用于在下面的列表中插入一个新节点......

Void NumberList::insertNode(double num)
{

ListNode *newNode;                   //A new node
ListNode *nodePtr;                   //To transverse the list
ListNode *prevIoUsNode = nullptr;    //The prevIoUs node

//Allocate a new node and store num there
newNode = new ListNode;
newNode->value = num;

//If there's no nodes in the list,make newNode the first node
if (!head)
{
    head = newNode;
    newNode->next = nullptr;
}
else      //Otherwise,insert newNode
{
   //Postion nodePtr at the head of the list
   nodePtr = head;
    
  //Initialize prevIoUsNode to nullptr.
  prevIoUsNode = nullptr;

 //Skip all nodes whose value is less than num. 
 while (nodePtr != nullptr && nodePtr->value < num)
 {
     prevIoUsNode = nodePtr;
     nodePtr = nodePtr->next;
 }

 //If the new node is the 1st in the list,insert it before all other nodes
 if (prevIoUsNode == nullptr)
 {
    head = newNode; 
    newNode->next = nodePtr;
 }
 else  //Otherwise insert after the prevIoUs node
 {
    prevIoUsNode->next = newNode;
    newNode->next = nodePtr;
  }
 }
}

`

我想知道为什么在代码中 prevIoUsNode 被初始化为 nullptr 两次?一次还不够好吗?

另一件事,谁能给我一个例子,说明如果存储的数据是字符或字符串,我们将如何将节点插入到列表中?因为在这个例子的 while 循环中,它声明节点中的数据必须小于传递给函数的数据。

谢谢。

解决方法

我想知道为什么在代码中 previousNode 被初始化为 nullptr 两次?一次还不够好吗?

一次就好了。第二个任务是多余的。

另一件事,谁能给我一个例子,说明如果存储的数据是字符或字符串,我们将如何将节点插入到列表中?

您将编写一个节点类型,其 value 成员可以存储您想要的类型(或使用 std::any,或者像 std::list 那样在存储类型上模板化整个内容)。

由于在此示例中的 while 循环中,它声明节点中的数据必须小于传递给函数的数据。

它不是这样做的:

//Skip all nodes whose value is less than num. 
 while (nodePtr != nullptr && nodePtr->value < num) { ... }

通过根据值选择插入位置来保持列表排序。 “跳过所有节点”这里的意思是“走过这些节点,这样新节点就会出现在列表中”

,

我想知道为什么在代码中将 previousNode 初始化为 nullptr 两次?

没有理由。

一次还不够好吗?

是的。