【问题标题】:reverse linked list recursively - different function signature递归反向链表 - 不同的函数签名
【发布时间】:2012-01-18 15:34:11
【问题描述】:

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

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

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

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

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

return NULL 

return lh 

分别

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

【问题讨论】:

    标签: c recursion singly-linked-list


    【解决方案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; 
     }
    

    【讨论】:

      【解决方案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);
      

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

        • 真正的好答案!清晰、完整并给出理由。
        • 这实际上不是作业问题,而是前一年的 sem end 试卷..无论如何,你的意思是做这样的事情吗?尾=反向(lh->下一个); lh->下一个 = NULL;返回尾巴;我没有得到我们想要做什么
        • @AseemDua 不,该代码不完整,因为lh 丢失了。您需要遍历尾部,直到看到将next 设置为NULL 的元素,并将lh 分配给该元素的next
        • 这就是颠倒指针的意思..但是当我回溯原始尾巴时会丢失..我如何保留它?
        • 哦,谢谢,现在我明白了我们是如何保留尾巴的……我试图将 p 等同于 lh 而不是尾巴,这让我没有什么可以保留/返回新的尾巴……while 循环很棘手部分
        猜你喜欢
        • 1970-01-01
        • 2011-12-19
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        相关资源
        最近更新 更多