0

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

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

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

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

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

return NULL 

return lh 

分别

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

4

3 回答 3

3

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

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

您已经回答了前两个:NULL并且lh是正确的答案。现在想想第三个:

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;
}
于 2011-12-12T17:02:32.820 回答
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);
于 2011-12-12T17:38:48.603 回答
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; 
 }
于 2011-12-12T17:02:20.420 回答