Reverse Nodes in k-Group
LeetCode上的25题:https://leetcode.com/problems/reverse-nodes-in-k-group/submissions/
题目
给出一个链表,和一个整数k,k小于等于链表长度,将链表划分为长度为k的区域,翻转每个区域的元素,若最后一个区域长度不为k,则不对该区域操作。返回翻转后的链表
Example:
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
要求:
只允许常数大小的额外空间
不修改node里的value值,只改变node顺序
题解
这里的解法思路比较简单,就是按顺序对每个长度为k的区间进行翻转,直到找到结尾。若链表大小不为k的倍数,则不处理最后一个区间
代码
/**
* 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 || k < 2) return head;
ListNode* start = head;
ListNode* prev_start = new ListNode(0);
prev_start->next = head;
ListNode* prev = prev_start;
while(start != NULL) {
ListNode* cur_head = start;
ListNode* k_node = start;
int i;
for (i = 0; i < k; i++) {
if (k_node->next == NULL && i != k - 1) break; //找到尾部且链表长度不为k的倍数
k_node = k_node->next;
}
if (i != k) break;
start = k_node; //下一个区间的头部
//翻转过程
for (i = 1; i < k; i++) {
ListNode* next_head = cur_head->next;
cur_head->next = k_node;
k_node = cur_head;
cur_head = next_head;
}
cur_head->next = k_node;
ListNode* temp = prev->next;
prev->next = cur_head;
prev = temp;
ListNode* p = prev_start->next;
while(p != NULL){
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
head = prev_start->next;
delete prev_start;
return head;
}
};