当前位置: 首页 > news >正文

206. 反转链表 92. 反转链表 II 25. K 个一组翻转链表

leetcode Hot 100系列

文章目录

  • 一、翻转链表
  • 二、反转链表 II
  • 三、K 个一组翻转链表
  • 总结


一、翻转链表

  1. 建立pre为空,建立cur为head,开始循环:先保存cur的next的值,再将cur的next置为pre,将pre前进到cur的位置,再将cur往前进一步(利用刚刚保存的值),直到cur为nullptr

代码如下:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur=head;
        ListNode* pre=nullptr;
        while (cur!=nullptr)
        {
            ListNode* temp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=temp;
        }
        return pre; 
    }
};

提示:小白个人理解,如有错误敬请谅解!

二、反转链表 II

  1. 这个和上面的区别就是从left开始,为了防止left为head,这样就没有p0了,所以要加入dummyhead,并且将dummyhead和head连起来
  2. 先要找到left位置的前一个作为p0,然后继续上面的操作,初始化pre为空,cur为p0的next,然后开始循环(循环的次数就是要翻转的个数):先保存cur的next位置,再将cur的next指向pre,随后pre到cur的位置,最后cur到之前保存的cur的next位置上,循环结束了之后,将p0的next的next指向cur,再才能将p0的next指向pre(如果这两个顺序反了,那由于先改变了p0的next的位置,再修改p0的next的next的时候,指向的位置就已经变了)
    代码如下:
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        ListNode* dummyhead=new ListNode(0);
        dummyhead->next=head;
        ListNode* p0=dummyhead;
        int m=left;
        m--;
        while (m--)
        {   
            p0=p0->next;
        }
        ListNode* pre=nullptr;
        ListNode* cur=p0->next;
        int n=right-left+1;
        while (n--)
        {
            ListNode* temp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=temp;
        }
        p0->next->next=cur;
        p0->next=pre;
        return dummyhead->next;
    }
};

三、K 个一组翻转链表

  1. 设置dummyhead,并且令p0为dummyhead,这样p0才是要翻转的链表的前一个
  2. 由于k组翻转链表,所以要先统计一下一共有多少个,每次循环(翻转了k个链表)就将这个总数减k,然后看剩下的值到不到k,如果到了才能继续进行循环
  3. 设置pre为空,cur为p0的next,开始小循环,最后结束之后,先要保存一下p0的next作为下一个要翻转的链表的p0,然后再继续之前的操作,将p0的next的next置为cur,再将p0的next置为pre,最后将p0设置为之前保存的p0的next值,由下图中可知对于下一组k的链表来说,他们的p0应该是 1 这个节点,也就是最开始保存的保存的p0的next

    图源@灵茶山艾府
  4. 返回dummyhead的next
    代码如下:
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* dummyhead=new ListNode(0);
        dummyhead->next=head;
        ListNode* curr=head;
        int count=0;
        while (curr!=nullptr)
        {
            curr=curr->next;
            count++;
        }
        ListNode* p0=dummyhead;
        while (count>=k)
        {   
            count-=k;
            ListNode* pre=nullptr;
            ListNode* cur=p0->next;
            int m=k;
            while (m--)
            {
                ListNode* temp=cur->next;
                cur->next=pre;
                pre=cur;
                cur=temp;
            }
            ListNode* nxt=p0->next;
            p0->next->next=cur;
            p0->next=pre;
            p0=nxt;
        }
        return dummyhead->next;
    }
};

总结

  1. pre统一设置为空,cur设置为p0的next,使用临时变量接受cur的next,最后要更新p0的位置!
http://www.dtcms.com/a/106749.html

相关文章:

  • 店铺状态设置-03.功能测试
  • Kotlin问题汇总
  • AI:机器学习-线性回归
  • 边缘计算赋能淘宝API:分布式节点缓存降低高并发延迟
  • 风电行业预测性维护解决方案:AIoT驱动下的风机健康管理革命
  • 多模态RAG实践:如何高效对齐不同模态的Embedding空间?
  • arcgis10.8 Toolbox中的conversion tools没有to coverage工具?
  • 4. 理解Prompt Engineering:如何让模型听懂你的需求
  • 【Kafka基础】基础概念解析与消息队列对比
  • Redis如何在windows中简单安装?
  • 线性DP总结
  • Centos 8 安装教程(新手版)
  • element-ui自制树形穿梭框
  • python操作es
  • 机器学习的一百个概念(8)插补法
  • LeetCode hot 100—最长递增子序列
  • PyQt5界面设计
  • 现代几何风格网页标牌标识logo海报标题设计psai英文字体安装包 Myfonts – Gilroy Font Family
  • React安装使用教程
  • vue3源码分析 -- runtime
  • ES6中增强对象
  • 虚幻引擎控制角色跟随移动方向旋转的方法
  • NLP高频面试题(三十二)——介绍一下CLIP和CLIP2
  • 【WebGL】getContext参数详解
  • 黑马 C++ 学习笔记
  • 红包-算法
  • HTB - Cat记录
  • Android学习总结之算法篇四(字符串)
  • 如何数据清洗
  • Python办公自动化(3)对Excel的操作