给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
虽然标的是困难题,但是难度并没有太大,我此前只了解过链表反转的几种方法,想了想还是选择了比较熟悉的就地逆置法,但是实操过程极其直白愚笨丑陋 /(ㄒoㄒ)/ ,时间和空间消耗如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
struct ListNode* beg = NULL;
struct ListNode* end = NULL;
struct ListNode* new = NULL;
struct ListNode* save = NULL;
beg = head;
end = head->next;
int num = 0; // 用于记录节点数量
struct ListNode* temp = NULL; // 用于遍历以得到节点数量
temp = head;
while (temp != NULL) {
temp = temp->next;
num++;
}
int count = 0;
while (num >= k) {
for (int i = 0; i < k - 1 && end != NULL; i++) {
beg->next = end->next;
end->next = head;
head = end;
end = beg->next;
}
if (count != 0) {
save->next = head;
}
num = num - k;
if (count == 0) {
new = head;
}
count++;
save = beg;
if (end != NULL) {
head = end;
beg = end;
end = end->next;
}
}
return new;
}
直接从答题界面复制过来的,用的是C语言,但是好像CSDN代码块不能设为C语言,所以这里是C++的形式,C语言中是没有new操作符的,这里的new只是一个变量
很幽默的代码,透露着新手小白的幼稚与淳朴,留给自己做个纪念,不知道以后看到了会是什么感觉呢?如果你感兴趣不妨和我聊聊!