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

版权声明:本文为博主原创文章,未经博主允许不得转载。 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位翻转,然后递归链表剩余的部分,最后返回头结点。

核心思想:

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

猜你喜欢

转载自blog.csdn.net/MyCodecOdecoDecodE/article/details/78129020