如何解决这是检查LinkedList节点是否已初始化的方法吗?
我正在尝试为链表类创建一个末端插入功能。我遇到了一些麻烦,因此我查看了一些代码并找到了以下内容:
if (!start) // empty list becomes the new node
{
start = newNode;
return;
}
这似乎是一项检查,以确保如果用户使用带有空列表的功能,则新创建的“结束”节点newNode
将成为起始节点。但是,if (!start)
的作用是什么? (start
是头节点。
解决方法
if (!start) // empty list becomes the new node
{
start = newNode;
return;
}
!
取反start
中的内容。因此,如果start为NULL
,则!NULL
的含义为true,因此它进入内部并将其作为起始节点。同样,当开始不是NULL
时,它也不会进入内部。
链接列表是作为指向节点对象的指针的链实现的。
空
--------- | start | -> nullptr ---------
1个节点
--------- --------- | start | -> | value | --------- --------- | next | -> nullptr ---------
2个节点
--------- --------- --------- | start | -> | value | |-> | value | --------- --------- | --------- | next | -| | next | -> nullptr --------- ---------
依此类推...
表达式if (!start)
正在检查start
指针是否为空,如果列表为空,则应该为空。检查指针时,该表达式等效于if (start == nullptr)
。
假设一个单链列表,那么您的函数很可能会实现大致类似于以下内容的
void insertAtEnd(T value)
{
node *newNode = new node;
newNode->value = value;
newNode->next = nullptr;
if (!start) // if (start == nullptr)
{
start = newNode;
return;
}
node *n = start;
while (n->next) // while (n->next != nullptr)
{
n = n->next;
}
n->next = newNode;
}
一种更简单,更可取的实现此功能的方法如下所示:
void insertAtEnd(T value)
{
node **n = &start;
while (*n) // while (*n != nullptr)
{
n = &((*n)->next);
}
*n = new node;
(*n)->value = value;
(*n)->next = nullptr;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。