博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 25 —— K 个一组翻转链表
阅读量:4572 次
发布时间:2019-06-08

本文共 2445 字,大约阅读时间需要 8 分钟。

1. 题目

1240

2. 解答

  • 首先,利用快慢指针确定链表的总结点数。

1240

  • 偶数个结点时,结点个数等于 i * 2。

1240

  • 奇数个结点时,结点个数等于 i * 2 + 1。

  • 然后将链表的每 K 个结点划分为一组。循环对每组的子链表进行,并依次拼接起来。

1240

1240

  • 最后,将多余的结点拼接在新链表最后面即可。

    1240

  • 代码如下
/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* reverseKGroup(ListNode* head, int k) {                if (head == NULL || head->next == NULL || k == 1) //空链表或只有一个结点或者 k=1 不用翻转,直接返回        {            return head;        }        else        {            int node_num = 0; // 链表的结点个数            ListNode* slow = head;            ListNode* fast = head;                        // 利用快慢指针确定链表的结点总个数            while(fast && fast->next)            {                slow = slow->next;                fast = fast->next->next;                node_num++;            }                        if (fast) // 奇数个结点            {                node_num = node_num * 2 + 1;            }            else // 偶数个结点            {                node_num = node_num * 2;            }                        int reverse_time = node_num / k; // 需要翻转链表的次数                        // 链表结点数小于 k,不需要翻转链表            if (reverse_time == 0)            {                return head;            }            else            {                ListNode* temp = head; // 保存链表的头结点                ListNode* tail = head; // 翻转后子链表的尾结点                ListNode* p1 = head;                ListNode* p2 = head;                ListNode* p3 = NULL;                for (int i = 0; i < reverse_time; i++)                {                    p2 = p2->next;                    // 进行 k-1 次翻转                    for (int j = 0; j < k-1; j++)                    {                        p3 = p2->next;                        p2->next = p1;                        p1 = p2;                        p2 = p3;                    }                    if (i == 0)                    {                        temp = p1; // 第一轮翻转,temp 指向翻转后的新链表的头结点                    }                    else                    {                        tail->next = p1; // 连接翻转后的子链表                    }                    tail = head; // 指向翻转后的新链表的尾结点                    head = p2; // 指向后面待翻转链表的第一个结点                    p1 = p2;                }                tail->next = head; // 连接多余的结点                return temp;            }                    }         }};

获取更多精彩,请关注「seniusen」!

seniusen

转载于:https://www.cnblogs.com/seniusen/p/9836175.html

你可能感兴趣的文章
TCP的状态迁移图
查看>>
统计连接到主机前十的ip地址和连接数
查看>>
第八周学习进度
查看>>
CopyUtils 讲一个对象的全部(或部分)属性值copy给另一个对象
查看>>
《局外人》豆瓣摘录
查看>>
数据库基础查询
查看>>
Eclipse安装SVN
查看>>
Linux性能优化建议
查看>>
OTL翻译(3) -- OTL的主要类
查看>>
java当中的定时器的4种使用方式
查看>>
hive
查看>>
Java集合排序(面试必考点之一)
查看>>
Tsql 获取服务器信息
查看>>
给laravel项目集成支付宝
查看>>
安装prometheus+grafana监控mysql redis kubernetes等
查看>>
Java眼中的XML--文件读取--1 应用DOM方式解析XML
查看>>
C++使用递归函数计算阶乘
查看>>
linker command failed with exit code 1 (use -v to see invocation)报错解决办法
查看>>
通用EF框架
查看>>
5-Java多态性理解
查看>>