版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MyCodecOdecoDecodE/article/details/78129020
LeetCode题目: 25. Reverse Nodes in k-Group
原题链接:https://leetcode.com/problems/reverse-nodes-in-k-group/description/
解题思路:
(虽说题目限制常数空间,但是用栈保存节点也是可行的一种方法,可以过)
将链表的前k位翻转,然后递归链表剩余的部分,最后返回头结点。
核心思想:
- 使用三个遍历节点对数组进行遍历,分别是preTemp,temp,nextTemp
- 反转时,使temp->next = preTemp即可
- 由于保存了nextTemp,可以继续向前遍历直到结束
代码细节:
- 当k<=1时,不需要反转。
- 递归到链表尾时,temp是空,因此nextTemp需要判断
坑点:
- k > list.size()时不反转
代码:
// 求List的长度
int getSize(ListNode* head) {
int size = 0;
while (head != NULL) {
size++;
head = head->next;
}
return size;
}
ListNode* reverseKGroup(ListNode* head, int k) {
// 三种情况不需要反转,直接输出
if (k <= 1 || head == NULL || getSize(head) < k) return head;
// 此时至少有两个节点
ListNode *newHead; // 反转后的新头结点
ListNode *preTemp = head; // 遍历节点的前一个节点
ListNode *temp = head->next; // 用于遍历的节点
ListNode *nextTemp = temp->next; // 遍历节点的后一个节点
for (int i = 1; i < k; i++) {
// 修改节点指向
temp->next = preTemp;
// 所有遍历用指针前移
preTemp = temp;
temp = nextTemp;
if (temp != NULL) nextTemp = temp->next;
}
// 对头结点赋值
newHead = preTemp;
// 未反转节点链接
head->next = reverseKGroup(temp, k);
return newHead;
}