这个条件
if ( head == NULL || data < head->data )
对于包含节点序列的列表中的每个节点,
不计算为真
1->2->3->8->NULL
因为数据9的值不小于现有节点的任何数据值。
所以函数将被递归调用,直到下一个节点等于 NULL(即当函数将参考最后一个节点的数据成员 next 等于 nullptr 时被调用)。结果,新节点被附加到列表的尾部。也就是说,列表中最后一个值为 NULL 的指针将被替换为新节点。因此节点按升序插入到列表中。
这是一个演示程序。
#include <iostream>
struct Node
{
int data;
Node *next;
};
void insert( Node * &head, int data )
{
if ( head == nullptr || data < head ->data )
{
head = new Node { data, head };
}
else
{
insert( head->next, data );
}
}
std::ostream & output( const Node *head, std::ostream &os = std::cout )
{
for ( ; head != nullptr; head = head->next)
{
os << head->data << " -> ";
}
return os << "null";
}
int main()
{
Node *head = nullptr;
for ( int data : { 3, 8, 1, 2, 9 } )
{
insert( head, data );
output( head ) << '\n';
}
return 0;
}
它的输出是
3 -> null
3 -> 8 -> null
1 -> 3 -> 8 -> null
1 -> 2 -> 3 -> 8 -> null
1 -> 2 -> 3 -> 8 -> 9 -> null
为了清楚起见,考虑一个包含两个节点的列表,其中数据为 1 和 3。
head |node A with value 1|next B| |node B with value 3| next nullptr|
|______________| |______________|
并且您正在尝试插入一个值为 2 的节点。
函数调用
insert( head, 2 );
head->等于1的数据不大于2。所以函数调用类似
insert( ( node A )->next, 2 );
(节点A)->next->数据等于3大于2。
所以你必须用值 2 的新创建节点的地址替换 ( node A )->next。
head |node A with value 1|next C| |node B with value 3| next nullptr|
|______________| | |
| |
|node C with value 2 | the value of next B of node A|