【LeetCode】- Reverse Nodes in k-Group

1、题目描述

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

Example:

Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5

Note:

Only constant extra memory is allowed.
You may not alter the values in the list’s nodes, only nodes itself may be changed.

2、问题描述:

  • 将一个链表进行k长度的翻转,每k个节点翻转一次,如果不足k个则不动。

3、问题关键:

  • 1.注意链表断链问题。
  • 2.先判断够不够k个节点,如果够,就一次翻转k个,建立三个指针,a, b, c, a指向第一个,b第二个,c第三个,再让b指向a,再让a指针移到b,b移到c,c指向下一个,c的左右是记录下一个防止断链。
  • 3.建立虚拟头结点,防止断链,

4、C++代码:

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if (!head) return head;
        ListNode* dummy = new ListNode(-1);
        dummy->next = head;
        auto cur = dummy;
        while(cur) {//cur只需要遍历一次。
            int s = 0;
            for (auto i = cur->next; i ; i = i->next) s ++;//判断当前链表长度是否足够进行翻转。
            if (s < k) break;
            
            s = 0;
            auto a = cur->next, b = a->next;//指向当前的第一个结点和下要给结点。
            while(s < k - 1) 
            {
                s ++;
                auto c = b->next;//记录下一个结点翻防止断链.  a----->b ------>c;
                b->next = a;
                a = b, b= c;
            }
            
            auto p = cur->next;//记录翻转前的头结点,也就是翻转后的最后一个结点。
            cur->next->next = b;//将翻转后的前链表的最后一个元素指向下一个链表的头。
            cur->next = a;//将上个链表的最后一个结点指向当前链表的头。
            cur = p;//cur 指向下一个链表的头。
        }
        return  dummy->next;
    }
};
    原文作者:邓泽军_3679
    原文地址: https://www.jianshu.com/p/8cc220599f73
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞