微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这是检查LinkedList节点是否已初始化的方法吗?

如何解决这是检查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 举报,一经查实,本站将立刻删除。