【问题标题】:C++ linked-list traversalC++ 链表遍历
【发布时间】:2012-04-04 04:16:59
【问题描述】:

我们的讲师展示了几个处理链表的函数示例(显示所有项目、删除位置、插入为头部、插入为尾部..)

现在,在这些示例中,我注意到他使用了不同的遍历方法。 在某些情况下,他会使用

while(head !=0)
{
    head=head->link;
}

在其他情况下,他用来从一个节点移动到另一个节点。

while(head->link !=0)
{
    head=head->link;
}

这让我很困惑。是否有理由在某些操作中使用一个而不是另一个?

【问题讨论】:

    标签: c++ linked-list


    【解决方案1】:

    如果head 最初是NULL,则第二个变体将导致段错误。

    除此之外,第一个变体将迭代N 次(其中N 是列表中的项目数)。第二个变体只会迭代N-1 次。

    【讨论】:

      【解决方案2】:

      第一个变体将在遍历后留下“head”指向一个“null”值。第二个变体假定 head 必须指向一个好的(非 NULL)head 值以开始,并且将让 head 指向一个具有 null link 的元素。因此,第二个变体可用于查找列表的最后一个元素,而第一个变体可用于计算列表中的项目数。

      【讨论】:

        【解决方案3】:

        在第一种情况下,他涵盖了列表最初可能为空(head = nil)的情况。您通常会在

        之前在循环内部进行任何处理
         head = head->link 
        

        行。

        在第二种情况下,大概他知道列表最初不是空的。在这种情况下,您通常会在

        之后进行任何处理
         head = head->link 
        

        line,虽然你可以,如果有原因,也可以在之前做一些。当然,这也可能不是一个有意识的决定,因为教授也是人;-)

        【讨论】:

          【解决方案4】:

          第二个例子实际上有两个问题。始终使用第一个。

          第一个问题正如 Oli Charlesworth 所说,如果在 head 为 NULL 的情况下进入循环,它将导致空指针取消引用(分段错误)。

          第二个问题是循环顶部和head=head->link;语句之间的任何代码都不会出现在链表的最后一个节点上。所以如果这个更新语句在循环的末尾(这是通常的做事方式),那么最后一个节点将被完全绕过。所以如果你的代码是这样的:

          while(head->link !=0)
          {
              dostufftoNode(head);
              head=head->link;
          }
          

          然后将为每个节点调用 dostufftoNode() 函数,最后一个节点除外。

          【讨论】:

            【解决方案5】:
            while(head !=0)
            {
                head=head->link;
            }
            

            这会

            1. 检查头部是否不为空
            2. 头对头->链接
            3. 去一个

            这将总共迭代 n 次

            while(head->link !=0)
            {
                head=head->link;
            }
            

            这会

            1. 检查 head->link 是否为空
            2. 头对头->链接
            3. 去一个

            这将总共迭代 n-1 次

            【讨论】:

            • 感谢您的所有回复。现在更有意义了。
            • 如果您对回复感到满意,请将最佳回复标记为答案
            猜你喜欢
            • 2013-07-28
            • 2018-11-23
            • 2018-03-27
            • 1970-01-01
            • 2017-09-03
            • 1970-01-01
            相关资源
            最近更新 更多