leetcode 链接:K 个一组翻转链表
《程序员代码面试指南》左程云 中相同题目:★★☆☆将单链表的每 K 个节点之间逆序
题目
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
解答 & 代码
每次数 K 个节点翻转
注意:代码第42-48行
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/class Solution {private:// 将 preHead 和 afterHead 之间的节链表翻转(不包含这两个节点本身)void reverseList(ListNode* preHead, ListNode* afterEnd){if(preHead == nullptr || preHead->next == afterEnd || preHead->next->next == afterEnd)return;ListNode* pre = afterEnd;ListNode* cur = preHead->next;while(cur != afterEnd){ListNode* next = cur->next;cur->next = pre;pre = cur;cur = next;}preHead->next = pre;}public:ListNode* reverseKGroup(ListNode* head, int k) {ListNode* dummyHead = new ListNode(-1, head);ListNode* preHead = dummyHead;ListNode* cur = head;int cnt = 0;while(cur != nullptr){++cnt;if(cnt < k)cur = cur->next;else{// 注意在反转完 k 个节点后,cur 节点的情况有所变化,因此要先保存下一步的 preHead 和 nextListNode* newPreHead = preHead->next;ListNode* next = cur->next;reverseList(preHead, cur->next);preHead = newPreHead;cur = next;cnt = 0;}}return dummyHead->next;}};
执行结果:
执行结果:通过执行用时:20 ms, 在所有 C++ 提交中击败了 66.26% 的用户内存消耗:11.1 MB, 在所有 C++ 提交中击败了 64.05% 的用户
