25. K 个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

 

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

 

说明:

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:纯模拟,每次取k个结点进行翻转,翻转后重新连接起来就可以了。

class Solution {
public:
    ListNode* work(ListNode* l, ListNode* r){  // 反转[l,r]中间的链表
        r->next=NULL;
        ListNode* rt=new ListNode(-1);
        ListNode* p=rt;
        rt->next=l; p=l;
        r=l->next;
        while(r){
            p->next=r->next;
            rt->next=r;
            r->next=l;
            l=r;
            r=p->next;
        }
        return rt->next;
    }
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(head==NULL||head->next==NULL||k<=1) return head;
        ListNode* rt=new ListNode(-1);
        ListNode* p=rt;
        int num=0;                         // 计数器
        ListNode* l=NULL; ListNode* r=head;
        while(r){
            num++;
            if(num%k==1) {l=r; r=r->next;} // 确定反转链表的最左端
            else if(num%k==0){             // 确定反转链表的最右端
                ListNode* e=r;
                r=r->next;
                p->next=work(l,e);
                while(p->next) p=p->next;
            }else r=r->next;
        }
        if(num%k!=0) p->next=l;            // 不足k个
        return rt->next;
    }
};

 

你可能感兴趣的:(链表,leetcode)