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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值