c - 递归反向链表 - 不同的函数签名

标签 c recursion singly-linked-list

有很多帖子可能有相同的问题,但问题是必须由

 node* reverseList (node * lh)
                              {
                               if(lh==NULL)............ ;

                                else if (lh->next==NULL)...........;

                                else ...........;
                              } 

三个空格必须填 前两个很简单

return NULL 

return lh 

分别

一种方法可能只是向下并反转指针,但在那种情况下,即使在回溯后我如何保持尾部完好无损?有可能吗?

最佳答案

解决递归问题的诀窍是假装你已经完成了。自己解决这个作业,需要回答三个问题:

  • 如何反转空列表? (即 lh 设置为 NULL 的列表)?
  • 如何反转只有一项的列表?
  • 如果有人可以为您反转列表中除初始项之外的所有项目,您应在何处将初始列表中的第一项添加到列表的预反转“尾部”部分?

您已经回答了前两个问题:NULLlh 是正确答案。现在想想第三个:

else {
    node *reversedTail = reverseList(lh->next);
    ...
}

此时,reversedTail 包含列表的预反转尾部。您需要做的就是将 lh->next 设置为 NULL,将其添加到您持有的列表的后面,然后返回 reversedTail。最终代码如下所示:

else {
    node *reversedTail = reverseList(lh->next);
    node *p = reversedTail; 
    while (p->next) p = p->next;
    p->next = lh;
    lh->next = NULL;
    return reversedTail;
}

关于c - 递归反向链表 - 不同的函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8477734/

相关文章:

Python 递归函数 - 这里发生了什么?

java - 如何交换两个节点及其在单链表中的内容?

c - 这个 c 递归函数产生这个页面错误有什么原因吗?

c - 内存未分配的指针变量可以工作。如何?

c - 从 unsigned char 读取 N 位时字节顺序是否重要

c - 递归函数查找回文

php - 正则表达式引擎如何使用递归子模式解析正则表达式?

c++ - 我可以在析构函数中调用公共(public)函数来释放内存吗?

c - 堆栈的链表,head->next 不断变为 null

c - 算法查找 2 个字符串中常见字符的数量