【发布时间】:2011-01-24 07:46:13
【问题描述】:
我正在学习 C 中的链接列表的考试。我发现自己是一个“审阅者”,它有这个 sn-p 代码。对于我的一生,我无法理解其余部分是如何逆转的。在这里……它来自 Nick Parlante 先生的 Linked List Problems(取自斯坦福大学 CIS 图书馆)。 我会加入尼克先生的评论。
RecursiveReverse() 解决方案
可能最困难的部分是接受这样一个概念: RecursiveReverse(&rest) 实际上确实反转了其余部分。然后有一个技巧 让一个前端节点一直到列表的末尾。画个图看看怎么做 诀窍奏效了。
void RecursiveReverse(struct node** headRef) {
struct node* first;
struct node* rest;
if (*headRef == NULL) return; // empty list base case
first = *headRef; // suppose first = {1, 2, 3}
rest = first->next; // rest = {2, 3}
if (rest == NULL) return; // empty rest base case
RecursiveReverse(&rest); // Recursively reverse the smaller {2, 3} case
// after: rest = {3, 2}
first->next->next = first; // put the first elem on the end of the list
first->next = NULL; // (tricky step -- make a drawing)
*headRef = rest; // fix the head pointer
}
我已经画了无数张图来试图追踪正在发生的事情,但我无法理解 RecursiveRest(&rest) 实际上是如何反转其余部分的。请帮忙。我越来越沮丧。我最终得到的是更小的“休息”……没有什么是逆转的。 非常感谢您。
【问题讨论】:
标签: c recursion linked-list reverse