【4.4日题解】——反转链表II(c代码表述)

请添加图片描述

☘前言☘

今天的题目也不难,就基本的贪心硬贪就好了。希望有想要提高的同学跟我们一起来刷题0.0
4.4日每日一题——反转链表II

🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
全文大约阅读时间: 20min



92. 反转链表 II

解题思路

先找到反转的起点的前一个结点和起点节点,其中前一个节点是为了头插,第一个节点就是反转之后的最后一个节点,进行记录,后面使用头插法进行反转,最终将最后的一个节点和后面的节点连起来就行了。
是不是完全没听懂????哈哈哈 看图
请添加图片描述
链表文字是很难表述清楚的,所以常画图吧。

今天写的代码

struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
    struct ListNode nohead;//头节点 统一left为0的情况
    nohead.next = head;
    struct ListNode*prev = &nohead;
    while(--left)     --right,head=head->next,prev = prev->next;
    struct ListNode  *nextlist, *end = head; //记录临时结点
    while(right--){
        nextlist = head->next;
        head->next = prev->next;
        prev->next = head;  //头插法
        head=nextlist;
    }
    end->next = nextlist;
    return nohead.next;
}

加入头节点是经常用的方式,大家一定要学会使用。
五个月前的代码

struct ListNode * fanzhuan(struct ListNode *head){
    struct ListNode *p = head,*prev = NULL;
    while(p){
        head = p->next;
        p->next = prev;
        prev = p;
        p = head;
    }
    return prev;
}

struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
    if(!head||!head->next) return head;
    int i =0;
    struct ListNode *prehead = (struct ListNode *)malloc(sizeof(struct ListNode)),*p = prehead,*prev,*hou,*temp;
    prehead->next = head;
    for(;i<left-1;i++) p = p->next;
    prev = p;
    for(;i<right;++i) p = p->next;
    hou = p->next;
    p->next = NULL;
    temp = prev->next;
    p = fanzhuan(prev->next);
    prev->next =p;
    temp->next = hou;
    return prehead->next;
}

其实感觉五个月前的代码更清晰,就是处理反转子串,然后连回来就好了,但是其实代码量有点大。大家自己取舍吧。

📑写在最后

今天就先这样,本来昨天打算开底层学习的,好家伙,上来就是开发板,完了一块垃圾版3000+,买不起,决定先跳过一部分内容,今天开始学习C++的东西,正好算法刷题也要用到,希望大家和我一起加油呀。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XingleiGao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值