0%

LeetCode-Day8

25. k个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :

1
2
3
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Solution {
public:
void reverseK(ListNode*& cur, int k) {
ListNode* head = cur;
ListNode* tail = NULL;
ListNode* pre = cur->next;
ListNode* back = pre->next;
for(int i = 1;i < k;i++) {
pre->next = tail;
tail = pre;
pre = back;
back = back->next;
}
pre->next = tail;
cur->next = pre;
for(int i = 0;i < k;i++) {
cur = cur->next;
}
cur->next = back;

}

void PrintList(ListNode* head) {
while(head != NULL) {
cout << head->val << " ";
}
cout << endl;
}

ListNode* reverseKGroup(ListNode* head, int k) {
int count = 0;
ListNode* H = new ListNode(0);
H->next = head;
ListNode* tmp = head;
while(tmp != NULL) {
tmp = tmp->next;
count++;
}
tmp = H;
while(count >= k) {
reverseK(H, k);
//PrintList(head);
count -= k;
}
return tmp->next;
}
};

解释:大致的想法就是先遍历一遍链表,然后记录下链表的个数count

每k个进行一次翻转,然后count - k,直到count < k,则停止循环

翻转的过程如下图:

![img](file:///C:\Users\12751\Documents\Tencent Files\1275121799\Image\C2C{F4B410F0-99BD-8F5D-3C49-BC4EA40B6DEE}.png)

Powered By Valine
v1.5.2