有很多帖子可能有同样的问题,但问题是必须由
完成 node* reverseList (node * lh)
{
if(lh==NULL)............ ;
else if (lh->next==NULL)...........;
else ...........;
}
必须填补三个空白 前两个只是
return NULL
和
return lh
repectively
一种方法可能只是向下并反转指针,但在这种情况下,即使在回溯后我怎么能保持尾部完整?它有可能吗?
答案 0 :(得分:3)
解决递归问题的诀窍是假装你已经完成了。要自己解决这项功课,你需要回答三个问题:
lh
设置为NULL
)的列表?您已经回答了前两个问题:NULL
和lh
是正确答案。现在想想第三个:
else {
node *reversedTail = reverseList(lh->next);
...
}
此时,reversedTail
包含列表的预翻尾。您需要做的就是在NULL旁边设置lh->,将其添加到您持有的列表的后面,然后返回reversedTail
。最终代码如下所示:
else {
node *reversedTail = reverseList(lh->next);
node *p = reversedTail;
while (p->next) p = p->next;
p->next = lh;
lh->next = NULL;
return reversedTail;
}
答案 1 :(得分:2)
我认为这回答了它:
node *reverseList(node *lh)
{
if (!lh) return NULL;
else if (!lh->next) return lh;
else {
node *new_head = reverseList(lh->next);
lh->next->next = lh;
lh->next = NULL;
return new_head;
}
}
它返回反转列表的头部,即原始列表的尾部。
head = reverse_list(head);
答案 2 :(得分:1)
下面是一个用于反转单个链表的API,这是我见过的最好的算法之一:
void iterative_reverse()
{
mynode *p, *q, *r;
if(head == (mynode *)0)
{ return;
}
p = head;
q = p->next;
p->next = (mynode *)0;
while (q != (mynode *)0)
{
r = q->next;
q->next = p;
p = q;
q = r;
}
head = p;
}