递归实现链表反转

用递归实现链表反转时,每次只考虑两个节点的反转就可以了,实现起来清晰很多。

下面给出链表的数据结构

typedef struct ListNode{
    int data;
    struct ListNode* next;
}LIST_NODE;

typedef struct List{
    LIST_NODE *head;
    LIST_NODE *tail;
    int size;
}LIST;

主要分两个步骤:

一:反转链表

二:交换头尾指针指向

void list_reverse(LIST *list)
{
    LIST_NODE *temp;
    //反转链表
    reverse(list->head); 
    //交换头尾指针
    temp = list->head;
    list->head = list->tail;
    list->tail = temp;
}

主要思想在于如何反转链表:

思考只有两个节点时,怎么反转 ,前节点 firstNode   后节点:secondNode

secondNode->next = firstNode;

firstNode->next = NULL;

即可。

下面直接贴代码

void reverse(LIST_NODE *head)
{
    if(head && head->next)//当至少有两个节点,才进行交换。退出递归条件也就是遇到最后一个节点
    {
        reverse(head->next);//
        head->next->next = head;
        head->next = NULL;
    }
}

递归比较奇怪,有时候只需要相信它能完成任务就可以很轻松的写出代码。但是要一步一步的分析怎么运行,反倒不好讲了。

只能这样留个大概思路吧。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值