C ++链表遍历

时间:2012-04-03 20:09:37

标签: c++ linked-list

我们的教师已经展示了几个处理链接列表的功能示例(显示所有项目,删除时间,插入为头部,插入尾部...)

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

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

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

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

这让我感到困惑。某些操作是否有理由使用其中一个?

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

第一个变体将在遍历后让“head”指向“null”值。第二个变体假设head必须指向一个良好的(非NULL)头部值,并且将头部指向一个带有空link的元素。因此,第二个变体对于查找列表的最终元素很有用,第一个变量对于计算列表中的项目数非常有用。

答案 2 :(得分:0)

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

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

线。

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

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

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

答案 3 :(得分:0)

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

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

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

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

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

答案 4 :(得分:0)

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

这将

  1. 检查head是否为空
  2. 设置头部 - >链接
  3. 转到一个
  4. 这将共迭代n次

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

    这将

    1. 检查head-> link是否为null
    2. 设置头部 - >链接
    3. 转到一个
    4. 这将总共迭代n-1次