LeetCode题目: 25. Reverse Nodes in k-Group

来源:互联网 发布:vr医疗软件 编辑:程序博客网 时间:2024/05/22 01:30

LeetCode题目: 25. Reverse Nodes in k-Group

原题链接:https://leetcode.com/problems/reverse-nodes-in-k-group/description/

解题思路:

(虽说题目限制常数空间,但是用栈保存节点也是可行的一种方法,可以过)

将链表的前k位翻转,然后递归链表剩余的部分,最后返回头结点。

核心思想:

  1. 使用三个遍历节点对数组进行遍历,分别是preTemp,temp,nextTemp
  2. 反转时,使temp->next = preTemp即可
  3. 由于保存了nextTemp,可以继续向前遍历直到结束

代码细节:

  1. 当k<=1时,不需要反转。
  2. 递归到链表尾时,temp是空,因此nextTemp需要判断

坑点:

  1. 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;}