【算法题】写一个递归版本的链表转置程序

来源:互联网 发布:unity 3d 教程知乎 编辑:程序博客网 时间:2024/06/03 18:38

链表的转置是一个很常见、很基础的数据结构题了,非递归的算法很简单,用三个临时指针在链表上循环一遍即可,不再赘述。递归算法也是比较简单的,但是如果思路不清晰估计也难一时半会儿写出来把。下面是递归版本的链表转置程序

#include <iostream>using namespace std;typedef struct Node{    Node(int v, Node *ptr=NULL) : data(v), next(ptr) {}    int data;    Node *next;}sNode;//LB_c: 输出链表,head为链表头指针void outputList(sNode *head){    sNode *p = head;    while (p != NULL)    {cout << p->data << " -> ";p = p->next;    }    cout << "NULL" << endl;}//LB_c: 转置链表的递归方法实现sNode* reverseList(sNode *head){    //LB_c: 异常判断(NULL==head)结束条件(NULL==head->nex),    // 即head为最后一个节点时,将该节点返回,即为转置链表的头节点。    if ( (NULL == head) || (NULL == head->next) )return head;    //LB_c: 递归后续链表(即以head->next为首节点的链表)    sNode *pNewHead = reverseList(head->next);    //LB_c: 上一步执行完后,head->next为后续链表的末尾节点,    //所以让head->next的next指向当前节点head    head->next->next = head;    //LB_c: 当前节点的next指向NULL    head->next = NULL;    //LB_c: 返回后续链表的头指针    return pNewHead;}int main(){    //LB_c: 创建链表    sNode n5(5);    sNode n4(4, &n5);    sNode n3(3, &n4);    sNode n2(2, &n3);    sNode n1(1, &n2);    //LB_c: 输出原始链表    outputList(&n1);    //LB_c: 调用转置函数    sNode *pNew = reverseList(&n1);    //LB_c: 输出转置后的链表    outputList(pNew);    return 0;}


原创粉丝点击