链表中的节点每k个一组翻转

描述

将给出的链表中的节点每k个一组翻转,返回翻转后的链表

如果链表中的节点数不是k的倍数,将最后剩下的节点保持原样 你不能更改节点中的值,只能更改节点本身。 数据范围:0≤n≤2000 ,1≤k≤2000 ,链表中每个元素都满足0≤val≤1000要求空间复杂度O(1),时间复杂度O(n)

例如: 给定的链表是1→2→3→4→5对于k=2 , 你应该返回2→1→4→3→5对于k=3 , 你应该返回3→2→1→4→5

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
 
class Solution {
public:
    /**
     *
     * @param head ListNode类
     * @param k int整型
     * @return ListNode类
     */
    ListNode* reverseKGroup(ListNode* head, int k) {
        // write code here
        ListNode* pn=nullptr;
        ListNode* cn=head;
        ListNode* nn=nullptr;
        ListNode* newhead=nullptr;
        ListNode* left0=nullptr;
        ListNode* left1=nullptr;
        int i=0,len=0,grouplen=0;
        while(cn!=nullptr){
            len++;
            cn=cn->next;
        }
        if(len==1||k==1||k>len||head==nullptr)
            return head;
        grouplen=len-len%k;//计算翻转的长度
        i=0;
        cn=head;
        while(i<grouplen){
            if((i%k)==0 && (i/k)%2==0)
                left0=cn;
            else if((i%k)==k-1 && (i/k)%2!=0)
                left0->next=cn;//将上一组的最左边结点指向这一组的最右边结点,将两组拼接起来
            else if(i%k==0 && (i/k)%2!=0)
                left1=cn;
            else if(i%k==k-1 && (i/k)%2==0 && i/k>0)
                left1->next=cn;//将上一组的最左边结点指向这一组的最右边结点,将两组拼接起来,第一组的最右边结点跳过
            else if(i==k-1)
                newhead=cn;
            nn=cn->next;
            cn->next=pn;
            pn=cn;
            cn=nn;
            i++;
        }
        if((i/k)%2==0)
            left1->next=cn;
        else
            left0->next=cn;
        return newhead;
    }
};
posted @ 2022-06-03 10:51  fishegg  阅读(74)  评论(0编辑  收藏  举报