链表

时间:2017-10-28 18:59:18

标签: c++ pointers data-structures linked-list

我只是想知道,在链表中两者之间的区别是什么:

node1 = node2

node1->next = node2

第一行让我有点困惑。

1 个答案:

答案 0 :(得分:2)

我假设从上下文中node1node2是指向节点的指针(例如,它们可能具有类似Node *的类型)。如果不是这样,请告诉我!

如果node1node2是指针,请记住指向节点的指针实际的,诚实到善的节点对象之间存在差异。指针只是一种说法“看那边,你会找到一个节点。”节点本身是包含数据和指向其他节点的链接的实际对象。

例如,如果您有两个指向节点的节点指针node1node2,可能它看起来像这样:

+----------+              +----------+
|          | -----------> |  data!   |
+----------+              +----------+
    node1                 |  next!   | -----> ...
                          +----------+

+----------+              +----------+
|          | -----------> |  data!   |
+----------+              +----------+
    node2                 |  next!   | -----> ...
                          +----------+

如果您编写node1->next = node2,则表示“请按照名为node1的指针查看其指向的节点,在该节点中找到next指针,并将其更改为指向node2点的任何地方。“这使事情看起来像这样:

+----------+              +----------+
|          | -----------> |  data!   |
+----------+              +----------+
    node1                 |  next!   | -----> ...
                          +----------+
                               |
                               |
                               v
+----------+              +----------+
|          | -----------> |  data!   |
+----------+              +----------+
    node2                 |  next!   | -----> ...
                          +----------+

编写node1 = node2表示“将node1更改为指向node2指向的节点。”看起来像这样:

+----------+              +----------+
|          | ------+      |  data!   |
+----------+       |      +----------+
    node1          |      |  next!   | -----> ...
                   |      +----------+
                   |           |
                   |           |
                   |           v
+----------+       |      +----------+
|          | ------+----> |  data!   |
+----------+              +----------+
    node2                 |  next!   | -----> ...
                          +----------+

从根本上说,这些操作之间没有太大的区别。它们都会改变指针指向的位置。区别在于您是要更改节点对象内的next指针,还是更改哪个节点node1指向。

每当您对涉及指针或链接列表等的代码行有疑问时,我强烈建议您绘制如此处所示的图片。为您正在创建的链接以及您正在破坏的链接建立直观的直觉是更好地理解代码如何工作的最佳方式之一。另外,它非常适合调试!