我勾画了这个小的单链表示例。但是由于某种原因,新节点没有被正确地附加到列表中。有人能帮我检查一下这个错误吗?
struct Node {
Node(int x, Node *next = nullptr) : x{x}, next{next} {}
int x;
std::shared_ptr<Node> next;
};
class LinkedList {
public:
LinkedList(std::vector<int> const &v) {
for (auto i = 0; i < std::size(v); ++i) {
auto temp = std::make_shared<Node>(v[i], nullptr);
if (head == nullptr) {
head = temp;
} else {
auto ptr = head;
while (ptr != nullptr) {
ptr = ptr->next;
}
ptr = temp;
}
}
}
std::shared_ptr<Node> head = nullptr;
};
int main() {
auto v = std::vector<int>{1, 2, 3};
auto l = LinkedList{v};
}
当你把ptr
分配给temp
时,想想它是什么
是一个局部变量,在while循环之前用链表的head
成员初始化。当你把temp
赋值给它时,你知道它的值是nullptr。因此,您已经将指向新节点的指针分配给当前持有nullptr的局部变量。如何将一个元素添加到链表中呢?
要在列表中插入一个项目,你需要一个指向列表中节点的指针,并将指针赋值给它的next
成员,例如
...
auto ptr = head;
while (ptr->next != nullptr) {
ptr = ptr->next;
}
ptr->next = temp;
...
但是正如在这个答案的评论中提到的,你插入每个项目的方式有O(n)运行时间,因为你需要遍历整个列表以找到末尾。正确的做法是每次插入操作为0(1)。