1

int LinkedList::DoStuff()
{
Node *Current    = next_;
while ( Current != NULL )
    {
        Current = Current->next_;
        length_++;
    }
    // At the last iteration we have reached the end/tail/last node
    return length_;
}

除了最后一个节点之外没有更多的节点。我怎样才能遍历到前端的尾端?

4

6 回答 6

6

除非您的链表是双向链表,否则这很难做到。递归是一种方法,假设您没有太大的列表以至于您将用完堆栈空间,就像这样(伪代码):

DoStuffBackwards (currNode) {
    if (currNode != NULL) {
        DoStuffBackwards (currNode->next);
        // Process currNode here.
    }
}

DoStuffBackwards (firstNode);

这是有效的,因为你一直调用DoStuffBackwards()下一个节点,直到你用完列表,然后当你回滚递归堆栈时,你处理每个节点。

于 2009-05-03T03:38:28.697 回答
1

如果您只想从最后一个节点倒退到当前节点,那么 Pax 的答案(使用递归)是您最好的选择,另请参阅下面的我的版本。如果您的当前节点不是您的非循环单链表的头,并且您想从当前节点转到头节点,那是不可能的。

int LinkedList::DoStuff()
{
    return DoStuffBackward(next_, 0);
}

int LinkedList::DoStuffBackward(Node* node, int n)
{
    if (!node)
    {
        return n;
    }

    int len = DoStuffBackward(node->next_, n + 1);
    std::cout << "doing stuff for node " << n << std::endl;
    return len;
}
于 2009-05-03T04:47:15.083 回答
1

这有家庭作业的味道,所以没有代码,但这里是一个不需要递归的解决方案的概述:

如果您想向后遍历列表,则在遍历列表以找到结尾时,可以选择重新链接列表以向后指向。然后,当您重新遍历列表(它以与原始列表相反的顺序访问节点)时,您重复与以前相同的重新链接,并且列表以其原始顺序结束。

这在概念上很简单,但是正确处理指针和链接(尤其是在列表的开头和结尾处)可能有点棘手。

于 2009-05-03T06:36:37.647 回答
0

您的链表类是双向链接的还是单链接的?如果每个节点内部没有前一个指针,则不能向后遍历。

我还建议您发布更多代码并花时间使您的问题易于阅读。

于 2009-05-03T03:23:29.000 回答
0

递归可以工作,就像构建一个辅助数据结构一样,例如一个数组,原始列表的每个元素都有一个条目。如果您想要一个不需要 O(n) 额外存储的单线程列表解决方案,最好的办法是按照 Michael 的建议将列表反转到位。我为此写了一个例子,[但考虑到对家庭作业的关注,我会省略它]。关于反转列表的一个注意事项:如果有任何其他数据结构包含指向原始列表的指针,并且您可能在遍历期间访问它们,如果它们需要在反转列表时访问它们,它们将无法工作,而这如果他们尝试修改列表,可能会导致数据损坏。

更新:好的,这是(C++)例程来反转一个列表。不过,它还没有经过测试。而且我会注意,如果这是家庭作业,发帖人仍然需要弄清楚如何正确使用此例程才能获得完整的答案。

Node *ReverseList(Node *head) {
    // Reverse a single-threaded list in place, return new head
    Node *prev=NULL;
    Node *cur=head;

    while (Node *next=cur->next_) {
        cur->next_ = prev;
        prev = cur;
        cur = next;
    }
    cur->next_ = prev;
    return cur;
}
于 2009-05-03T06:53:46.420 回答
0

将列表推入堆栈,然后将它们弹出。

于 2009-05-03T11:27:56.323 回答