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

时间:2011-12-12 16:48:18

标签: c recursion singly-linked-list

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

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

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

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

必须填补三个空白 前两个只是

return NULL 

return lh 

repectively

一种方法可能只是向下并反转指针,但在这种情况下,即使在回溯后我怎么能保持尾部完整?它有可能吗?

3 个答案:

答案 0 :(得分:3)

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

  • 你如何扭转空名单? (即lh设置为NULL)的列表?
  • 如何仅使用一个项目反转列表?
  • 如果有人可以撤消列表中除初始项目之外的所有项目,您在哪里将初始列表中的第一项添加到列表中预先反转的“尾部”部分?

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

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; 
 }