我想知道,以下两段代码如何将新节点插入到链接列表中?
在Version1中,有一个prev
指针可以将前一个节点挂起到新节点。
但我在版本2中没有看到。在版本2中,先前的链接被破坏(即,它没有链接到新节点),我错过了什么?
答案 0 :(得分:1)
让我们深入了解您的第2版插入内容:
void RecInsertSorted(Entry*& list, Entry* newOne) {
if (list == nullptr || newOne->name < list->name) {
newOne->next = list;
list = newOne;
else {
RecInsertSorted(list->next, newOne);
}
}
您不需要prev
,因为这项工作是通过电话进行的。这是为什么?因为list
参数是对指针的引用。
假设我们在第一个和第二个元素之间插入newOne
。最后,您希望列表看起来像:
element1 - &gt; newOne - &gt;在element2
当满足条件newOne->name < list->name
时,list
引用element2。但这是对指针的引用,引用引用了element1-&gt; next!因此,当语句list = newOne;
运行时,它会相应地更新element1->next
,并且您的列表格式正确。
同样,在最后插入newOne
时,list
为nullptr
。但同样,它是一个引用,因此newOne->next
变为nullptr
,newOne
成为列表的末尾。
同样,如果必须在第一个元素之前插入newOne
,它会更新一些head
指针,以便跟踪列表的头部...因此成为列表的第一个元素。