单向链表的递归反转

单向链表反转的递归实现


#include <iostream>

// 链表的节点类型 
struct LinkNode 
{
    int Val;    
    LinkNode * Next;
    LinkNode() { Next = NULL; }
    LinkNode(int v) { Val = v; Next = NULL; } 
};

// 链表类型 
struct List
{
    LinkNode * Head;
    LinkNode * Tail;

    List() 
    {
        Head = new LinkNode;    // dummy node
        Tail = Head;
        Tail->Next = NULL;
        Tail->Val = -1;
    }

    ~List()
    {
        LinkNode * temp;
        while (!empty()) {
            temp = deleteFirstNode();
            delete temp;
        }   
    }

    LinkNode * deleteFirstNode() 
    {
        LinkNode * temp = Head;
        Head = Head->Next;
        return temp;
    }

    void addTailNode(LinkNode * n)
    {
        if (empty()) {
            Head = n;
            n->Next = Tail; 
        } else {
            // 遍历链表,定位到最后一个节点(非哑节点) 
            // 若双向链表,不需遍历 
            LinkNode * t = Head;
            for (; t->Next != Tail; t = t->Next) ;
            t->Next = n;
            n->Next = Tail;
        }
    }

    void print()
    {
        for (LinkNode * t = Head; t != Tail; t = t->Next) {
            std::cout << t->Val << " ";
        }
        std::cout << std::endl;
    }

    bool empty()
    {
        return Head == Tail;
    }
};

// 使用递归的方式反转单向链表
// ---------------------
// 先删掉链表的第一个节点, 然后反转链表
// 最后把删除的第一个节点 链接 到反转后的链表后面 
void reverseList(List & l)
{
    if (l.empty()) return ;
    LinkNode * first = l.deleteFirstNode();
    reverseList(l);
    l.addTailNode(first);
}

int main()
{
    List l;
    // 添加100个元素测试 
    for (int i = 1; i <= 100; ++i) {
        l.addTailNode(new LinkNode(i));
    } 
    l.print();
    reverseList(l);
    l.print();
    return 0;
}

还可以直接使用堆栈实现,效率更高。其实递归也是隐式使用堆栈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值