C语言 | Leetcode C语言题解之第25题K个一组翻转链表

文章介绍了如何使用C语言实现一个名为`reverseKGroup`的函数,该函数可以将给定链表中的每k个连续节点进行反转,同时保持链表结构。通过定义`TwoAddress`结构体来保存反转前后链表的头尾节点,有效地完成了这个链表操作。
摘要由CSDN通过智能技术生成

题目:

题解:

/* 定义保存两个地址的结构体
 * 用来保存反转后结果的头节点和尾节点
 */
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值