【发布时间】:2016-09-22 00:05:24
【问题描述】:
我正在练习使用 C 的链表。我是一名初学者程序员,两周前刚开始学习 C。
我非常了解链表的概念,我试图使用递归来反转链表。
我知道如何使用 while 循环来反转它,但是在我反转列表后如何将头指针指向最后一个数字地址而不是初始第一个数字地址。
下面是我的反向函数。头部在 main 中定义,我通过引用到我的函数中来调用它。我知道我可以通过按值调用它并只写 main() head=reverse(node* head); 来解决这个问题或者通过在动态内存中定义 head 并直接从函数中访问它。我不想那样做。我想通过 main 的引用和返回 void 的函数来调用它。
这是我的反向函数:
void reverse(struct node** head)
{
struct node* p=*head;
if(p->link==NULL)
{ *head=p;
return;
}
reverse(&(p->link));
p->link->link=p;
p->link=NULL;
}
说清单是: 5 6 7 2 3 4 我在反向后得到的输出是: 5 我知道原因是因为头部仍然指向第一个数字地址。我无法弄清楚如何将其指向最后一个数字地址。当它破坏递归函数时,它应该在 if 语句中这样做。但它不起作用。
谢谢!
【问题讨论】:
-
好吧,如果您以指定和反转列表的方式使用递归,则头部不应再成为头部,而链表的尾部将成为头部......那么曾经是头变成了尾巴,尾巴变成了头。为了获得新的头,您需要访问旧的尾节点
-
是的,我知道,但是如何返回旧尾巴的地址?应该 *head=p;在 if 语句中是这样做的吗?
-
如何返回tail的地址?好吧,如果您在最后一个节点上调用该函数,则返回该节点的地址。否则,请考虑要对递归调用返回的地址做什么。
-
函数返回一个void,我无法通过递归调用返回地址。我的意思是如何访问原始头部的地址以便将其分配给尾部?
标签: linked-list