25. K 个一组翻转链表

leetcode-25. K 个一组翻转链表

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
48
49
50
51
52
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if(k == 1) return head; // 如果k等于1,则直接返回原链表头结点head
ListNode* temp = new ListNode(); // 创建一个临时节点temp
temp->next = head; // 将temp的下一个节点指向head,即temp为头节点的前一个节点
int t = 0; // 计数器,用于记录翻转了几组
vector<ListNode*> n(k+1, temp); // 创建一个vector,用于存储当前要翻转的k个节点
while(n[0] != nullptr) // 当还有剩余节点时循环
{
for(int i = 0; i < k; i++) // 将要翻转的k个节点存入vector
{
if(n[i]->next != nullptr) // 如果当前节点的下一个节点不为空,则将下一个节点存入vector
{
n[i+1] = n[i]->next;
}
else return head; // 如果下一个节点为空,则直接返回原链表头结点head
}
if(t == 0) // 如果是第一组,则将头结点指向翻转后的第一个节点
{
head = n[k];
}
for(int i = 1; i < (k/2) + 1; i++) // 将k个节点进行翻转,分别从两端向中间交换
{
if(i == 1) // 如果是第一个节点,则需要更改其下一个节点和上一个节点的指针
{
n[i-1]->next = n[k-i+1];
n[i]->next = n[k-i+1]->next;
}
else // 如果不是第一个节点,则需要更改其下一个节点和上一个节点的指针,以及两端节点的指针
{
n[k-i+2]->next = n[k-i+1];
n[i]->next = n[i-1];
}
if(k%2 == 0 && i == k/2) // 如果k是偶数并且当前节点为中间节点,则需要特殊处理其下一个节点的指针
{
n[i+1]->next=n[i];
}
else // 如果不是中间节点,则需要更改其下一个节点和上一个节点的指针,以及两端节点的指针
{
n[k-i+1]->next = n[i+1];
n[k-i]->next = n[i];
}
}

n[0] = n[1]; // 将下一组的第一个节点存入vector[0],循环使用vector
t++; // 计数器加1,记录翻转的组数
}

return head; // 返回翻转后的链表头结点head
}
};

看了一眼别人的题解,好像别人的写的也很长。