栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

k个一组反转链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

k个一组反转链表

一、递归
  • 思路:k_reverse取k个节点反转,剩下的再调用k_reverse取k个节点反转,直到节点数不等于k
  • 关键在于理解part_reverse后的k个节点是end开头,head结尾,所以前k个节点的head指向后k个节点的end(已经反转的)
  • 想不清楚可以先看循环版本
struct link
{
    int a;
    link* next;
};

link* part_reverse(link *begin, link *end) {
    link *pre = end->next;
    while(pre != end) {
        link *tmp = begin->next;
        begin->next = pre;
        pre = begin;
        begin = tmp;
    }
    return pre;
}

link* k_reverse(link* head, int k) {
    int cnt = 0;
    link * end = head;
    while(end != NULL) {
        ++cnt;
        if(cnt == k) break;
        end = end->next;
    }
    if(cnt != k) return head;
    link *tmp = part_reverse(head, end);
    head->next = k_reverse(head->next, k);
    return tmp;
}
二、循环
link* part_reverse(link *begin, link *end) {
    link *pre = end->next;
    while(pre != end) {
        link *tmp = begin->next;
        begin->next = pre;
        pre = begin;
        begin = tmp;
    }
    return pre;
}

link* k_reverse(link* head, int k) {
    int cnt = 0;
    link *end = head;
    while (end != NULL)
    {
        ++cnt;
        if(cnt == k) break;
        end = end->next;
    }
    if(cnt != k) return head;
    link *res = part_reverse(head, end);
    while(1) {
        cnt = 0;
        link *pre = head;
        head = pre->next;
        end = head;
        while(end != NULL) {
            ++cnt;
            if(cnt == k) break;
            end = end->next;
        }
        if(cnt != k) return res;
        pre->next = part_reverse(head, end);
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1002276.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号