C++经典的指针反转算法

文章介绍了如何使用递归函数来实现链表的反转。通过定义节点的当前值和后续值,创建指针序列,从头开始,递归处理每个节点,直到找到最后一个节点,然后与其前一个节点交换并更新指针头。这种方法在非最后一个节点时会挂起函数,等待后续处理。
摘要由CSDN通过智能技术生成

       我们抽象一个节点:当前值,后续值,这样就可以当前值、后续值创建一个指针序列,通过递归函数实现经典反转。该反转的经典之处在于:从头开始,如果不是最后一个node,直接递归,后续执行挂起,直到找到最后一个node,直接与前一个node交换,且把指针头设为最后一个node。前面挂起的函数再依次执行。

#include <iostream>
using namespace std;

struct node
    {
        int val;
        node *next;
    };

    node *start;                        //指针头

    void insert(int x)
    {
        node *t = start;
        if (start == NULL)
        {
            node *n = new node();
            n->val = x;
            n->next = NULL;
            start = n;
        }
        else
        {
            while (t->next!=NULL)
            {
                t = t->next;
            }
            node *n = new node;
            n->val = x;
            n->next = NULL;
            t->next = n;
        }
    }

   //反转函数

    void reverse(node *p, node *q)
    {
        //如果是最后一个node,则直接反转,并设为指针头
        if (q->next == NULL)
        {
            q->next = p;
            p->next = NULL;
            start = q;
        }
        else
        {

            //如果不是最后一个node,直接递归,函数执行暂停,直到找到最后一个node
            reverse(q, q->next);
            q->next = p;
            p->next = NULL;
        }
    }

    void show()
    {
        node *t = start;
        cout << std::endl;
        while (t->next != NULL)
        {
            cout << t->val << "\t";
            t = t->next;
        }
        cout << t->val << "\t";
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值