c - 反向链表

标签 c data-structures linked-list

我正在尝试使用递归反转链表并为其编写了以下代码。该列表是列表的开头。

 node *reverse_list_recursive(node *list)
 {
      node *parent = list;
      node *current = list->next;

      if(current == NULL)
       return parent;

      else
       {
           current = reverse_list_recursive(current);
           current->next = parent;
           printf("\n %d  %d \n",current->value,parent->value);
           return parent;
       }

  }

我可以看到所有链接都被反转了。但是,当我尝试显示时,我得到了无限的数字打印。当我试图反转列表中最初的第一个数字的链接时,我怀疑有错误。

我做错了什么?

最佳答案

假设我有一个链表:

 ----------      ----------      ----------      ---------- 
|  1  |    |--->|  2  |    |--->|  3  |    |--->|  4  |    |--->NULL
 ----------      ----------      ----------      ---------- 

您的代码将其转换为:

   ----------------------          ----------------------
   |                    |          |                    |
   v                    |          v                    |
 ----------      ----------      ----------      ----------
|  1  |    |--->|  2  |    |    |  3  |    |    |  4  |    | 
 ----------      ----------      ----------      ---------- 
                   ^                    |
                   |                    |
                   ----------------------

注意第一个元素仍然指向 2。

如果在前两个之后添加 parent->next = NULL 行,您将得到:

           ----------------------          ----------------------
           |                    |          |                    |
           v                    |          v                    |
         ----------      ----------      ----------      ----------
NULL<---|  1  |    |    |  2  |    |    |  3  |    |    |  4  |    | 
         ----------      ----------      ----------      ---------- 
                           ^                    |
                           |                    |
                           ----------------------

这实际上是正确的结构。

完整代码为:(每次递归调用只需要打印当前值即可)

node *reverse_list_recursive(node *list)
  {
      node *parent = list;
      node *current = list->next;

      if(current == NULL)
       return parent;

      else
       {
           current = reverse_list_recursive(current);
           parent->next = NULL;
           current->next = parent;
           printf("\n %d \n",current->value);
           return parent;
       }

  }

关于c - 反向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4078864/

相关文章:

data-structures - 如何在函数式编程中实现内存有效的集合的无损操作?

java - 多线程服务器

java - 使用Java制作查询结果表(GUI)

c - 在 C 中添加到 FIFO 队列尾部时遇到问题,引用最后一个元素

vector - IDRIS向量与链表

c - 简单 MPI_Scatterv 示例中的错误

c - 将 INT32 数组转储到 .bin 文件中

c - 为什么我使用以下代码从 valgrind 获取 "invalid read"和 "invalid write"?

c - 带方括号的 Typedef 声明

c - 读一段c语言