首页 > 其他分享 >[LeetCode]12. K 个一组翻转链表 C语言实现

[LeetCode]12. K 个一组翻转链表 C语言实现

时间:2024-04-02 15:16:01浏览次数:15  
标签:12 ListNode struct next 链表 tail curr C语言 节点

Problem: 25. K 个一组翻转链表

目录

思路

官方思路

多指针+翻转链表+结构体

解题方法

定义多指针
用来查找的头节点
每一组的头节点
每一组的尾节点,用来找到下一组头节点

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n)$

空间复杂度:

添加空间复杂度, 示例: $O(1)$

Code

/* 定义保存两个地址的结构体
 * 用来保存反转后结果的头节点和尾节点
 */
typedef struct {
    struct ListNode* head; 
    struct ListNode* tail; 
} TwoAddress;
// 反转中间链表
TwoAddress* reverse(struct ListNode* head){
    struct ListNode* prev = NULL;
    struct ListNode* curr = head;
    TwoAddress* ans = (TwoAddress*)malloc(sizeof(TwoAddress));
    ans->tail = head;
    while(curr){
        struct ListNode* temp = curr->next;
        curr->next = prev;
        prev = curr;
        curr = temp;
    }
    ans->head = prev;
    return ans;
}
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
    struct ListNode* dummyHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    dummyHead->next = head;
    // 每一组的查找头节点,做标志用,本身不查找,并且用来连接两组之间的头节点和尾节点
    struct ListNode* prev = dummyHead; 
    // 翻转头节点
    struct ListNode* curr = head;
    while(curr){
        // 尾节点,查找本组的末尾,将其next设置为NULL
        struct ListNode* tail = prev;
        for(int i=0;i<k;i++){
            tail = tail->next;
            if(!tail) return dummyHead->next;
        }
        // 保存下一组的头节点
        struct ListNode* next = tail->next;
        tail->next = NULL;  //断开
        TwoAddress* temp = reverse(curr);  // 翻转这组
        prev->next = temp->head;  // 拼接
        temp->tail->next = next;
        prev = temp->tail;
        curr = temp->tail->next;
    }
    return dummyHead->next;
}

标签:12,ListNode,struct,next,链表,tail,curr,C语言,节点
From: https://www.cnblogs.com/xiaofengs/p/18110595

相关文章

  • CSCI 2122翻译指令集
    CSCI2122任务4截止日期:2024年3月22日星期五晚上11:59,通过git提交目标本课业的目的是练习用C进行编码,并强化中讨论的概念关于程序表示的类。在这个任务1中,您将实现一个二进制翻译器2,如Rosetta3。您的程序将从翻译一个简单的指令集(比x86简单得多)到x86并生成x86汇编代码。代码将然后......
  • C语言基础-标准输入输出
    标准库实现了简单文本的输入输出模式。以下的示例在使用时都需要先包含标准输入输出头文件stdio.h#include<stdio.h>输入getchar函数intgetchar(void);从标准输入(一般为键盘)中一次获取一个字符调用时,返回输入的字符遇到文件结尾时返回EOFEOF也定义在stdio.h中,其......
  • 面向对象12:什么是多态?
    packagecom.oop.demo06;publicclassStudentextendsPerson{publicvoidrun(){System.out.println("son");}publicvoideat(){System.out.println("eat");}}/*多态注意事项:1.多态是方法的多态,属性没有多态2.父类和子类,有......
  • C语言程序10题
    第101题(10.0分)          难度:易       第2章/*-------------------------------------------------------【程序填空】---------------------------------------------------------功能:计算平均成绩并统计90分以上人数。----------------------......
  • C语言-角谷步数
    题目描述你听说过角谷猜想吗?任意的正整数,比如5,我们从它开始,如下规则计算:如果是偶数,则除以2;如果是奇数,则乘以333再加1。如此循环,最终必会得到1!比如5 的处理过程是:5168421一个正整数经过多少步才能变成1,称为角谷步数。对于5而言,步数也是5。对于1,步数......
  • python项目练习——12.在线购物商城应用程序
    项目功能分析:这个项目可以让用户浏览商品、添加商品到购物车、进行结账等操作。这个项目涉及到数据库操作、用户认证、支付集成等方面的技术。代码示例:#models.pyfromdjango.dbimportmodelsfromdjango.contrib.auth.modelsimportUserclassProduct(models.Model)......
  • SGM61230同步降压转换器
    这份文件是SGMicroCorp的SGM61230同步降压转换器的产品数据手册。以下是文件的核心内容概要:概述:SGM61230是一款由SGMicroCorp生产的同步降压转换器,设计用于在宽输入电压范围内提供高电流输出。以下是对该产品的详细概述:1.**输入电压范围**:-设备能够在4.5V至......
  • 【leetcode】链表篇刷题 --
    //删除指定value节点classSolution{public:ListNode*removeElements(ListNode*head,intval){//单独处理headwhile(head!=NULL&&head->val==val){ListNode*temp=head;head=head->next;......
  • C语言链表:链式魔法,数据之美
    导入链表,作为C语言中一种基础且重要的数据结构,以其独特的方式组织和存储数据,成为了解决许多复杂问题的关键。下面,我们将更具体地探讨C语言链表的各个方面。一、链表的基本结构链表由一系列节点组成,每个节点通常包含两部分:数据域和指针域。数据域用于存储实际的数据,而指针域......
  • c语言字符串逆序-基础知识
    c语言字符串逆序(1)错误输出(2)正确输出:方法1(3)正确输出:方法2......