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

leetcode日常刷题

题目:K个一组翻转链表

在这里插入图片描述

思路

题目要求k个一组进行反转,首先考虑到如果k为1,那就可以直接返回链表头,这种情况没必要翻转。
如果只有一个节点或者head为空结点,直接返回head即可(一个节点翻转k次都是本身)

if(!head || !head->next || k==1) return head;

其次对于链表题型,在表头head前增加一个哑节点能省去很多麻烦(省去头节点特殊处理)

ListNode *dummy= new ListNode(0,head);// 哑节点

具体实现思路为:

在这里插入图片描述
根据上图,需要实现一个函数reverse实现子链表翻转,在reverseKGroup中需要不断前移指针,具体代码为:

class Solution {
public:
    // 双指针反转链表,返回头节点和尾节点
    vector<ListNode *> reverse(ListNode* head,ListNode *tail){
        tail->next =nullptr; // 断链
        ListNode * dummy= nullptr;
        ListNode * head_next;
        ListNode * sign; // 标记尾节点
        while(head!=nullptr){
            head_next =head->next;
            head->next = dummy;
            if(!dummy) sign = head;
            dummy = head;
            head = head_next;
        }
        return {dummy,sign};

    }
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(!head || !head->next || k==1) return head; // 空链表或单节点可以直接return
        ListNode *dummy= new ListNode(0,head);// 哑节点
        ListNode *pre_tail = dummy; // 记录tail前一个节点的指针
        ListNode *tail = head;
        ListNode *head_next; //记录head下一个节点的指针
        while(true){
            // head前移k-1次(因为head起点已经占了一个位置)
            for(int i=0;i<k-1;i++) {
                if(!head) return dummy->next;
                head=head->next;
                if(!head) return dummy->next;
            }
            head_next = head->next;
            vector<ListNode*> reverse_res;
            reverse_res = reverse(tail,head);
            // 接回原链表
            pre_tail->next = reverse_res[0];
            reverse_res[1]->next = head_next;
            // 确定head,tail新起点
            pre_tail = reverse_res[1];
            head =tail = head_next;
        }
        return dummy->next;
    } 
};

相关文章:

  • 如何对AI玩家进行改进
  • QT错误集合
  • 人工智能与网络安全
  • 动态内存分配与内存对齐
  • MySQL 的 JSON 查询
  • Python 实现机器学习小项目实战教程*
  • 设计模式-结构型模式-外观模式
  • 第十五届蓝桥杯PythonB组
  • Node.js 批量修改文件名脚本
  • 华为OD机试A卷 - 密室逃生游戏(C++ Java JavaScript Python )
  • MQ 如何保证数据一致性?
  • Linux下的socket演示程序2
  • 【Linux网络(七)】数据链路层
  • MySQL 表 t1 建立联合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效
  • 一台电脑最多能接几个硬盘?
  • localhost 和 127.0.0.1 的区别
  • 图解AUTOSAR_SWS_FlashDriver
  • 5G核心网(5GC)开户中,DNN(Data Network Name,数据网络名称)
  • 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解
  • Python 爬虫案例
  • 外贸平台网站有哪些/成功营销案例100例
  • 软件工程师薪资待遇/seo培训优化课程
  • 江苏省建设局官方网站查询/产品关键词
  • 重庆制作网站速成班/网站收录
  • 全影网的网站哪儿做d/360收录提交
  • 怎么做公司网站的二维码/新品牌推广策划方案