为什么在链表中创建当前变量时不使用"new"?



这是打印链表元素的解决方案。

为什么不是Node *current = new Node;,然后是current = head;

void printLinkedList(Node* head)
{
Node *current = head;    
while(current!=NULL){
cout << current -> data << endl;
current = current -> next;
}
}

这是一个画画的好地方!

假设我们有一个由head:指向的链接列表

head
|
v
+------+    +-----+    +-----+    +-----+
| i'm  | -> | the | -> | bad | -> | guy | -> null
+------+    +-----+    +-----+    +-----+

如果我们使用代码行

Node *current = new Node;

那么内存看起来是这样的:

head                                                current
|                                                    |
v                                                    v
+------+    +-----+    +-----+    +-----+            +------+
| i'm  | -> | the | -> | bad | -> | guy | -> null    | duh! | -> ?
+------+    +-----+    +-----+    +-----+            +------+

该函数的目标是打印head指向的现有列表,但这里我们有一个指向新链表单元格的指针,该单元格不是现有列表的一部分。因此,我们犯了两个编程罪:

  • 我们已经为一个不需要的对象分配了内存
  • 我们违反了与客户签订的合同

另一方面,如果我们写

Node *current = head;

那么内存看起来是这样的:

head
|
v
+------+    +-----+    +-----+    +-----+
| i'm  | -> | the | -> | bad | -> | guy | -> null
+------+    +-----+    +-----+    +-----+
^
|
current

在这里,current现在指向现有的列表,因此我们可以遍历列表以找到我们需要的内容。这里不需要创建新节点,因此我们不创建任何新节点。

一般来说,在C++中,除非您真的想创建一个新的链表单元格,否则应该避免使用new。在这种情况下,我们不想这样做,这就是为什么我们创建current并使其指向现有的链表单元格。

希望这能有所帮助!

因为节点已经存在。

CCD_ 8将创建一个新的。

你不需要也不想创建一个新的。

您只想"使用"一个指向现有节点的指针。

这只是将函数参数复制到具有不同名称的变量中。实际上这完全没有必要。

相关内容

  • 没有找到相关文章

最新更新