递归可以工作,就像构建一个辅助数据结构一样,例如一个数组,原始列表的每个元素都有一个条目。如果您想要一个不需要 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;
}