25. k个一组翻转链表

给出一个链表,每 个节点一组进行翻转,并返回翻转后的链表。

是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 的整数倍,那么将最后剩余节点保持原有顺序。

示例 :

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

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

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

说明 :

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
  • /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* reverseKGroup(ListNode* head, int k) 
        {
            if(head==NULL)
                return head;
            ListNode * tou=head;
            ListNode * wei=head;
            ListNode *last=head->next;
            ListNode* newhead=head;
            ListNode* before;
            ListNode *p;
            int state=1;
            int count=1;
                                ListNode * pp=last;
                        while(count<k&&pp!=NULL)
                        {
                            count++;
                            pp=pp->next;
                        }
                        if(count==k)
                            count=1;
                        else
                            return newhead;
                while(count<k&&last!=NULL)
                {
                    p=last->next;
                    last->next=wei;
                    wei=last;
                    last=p;
                    count++;
                    if(count==k)
                    {
                        if(state==0)
                            before->next=wei;
                        before=tou;
                        if(state==1)
                        {
                            newhead=wei;
                            state=0;
                        }
    
                        tou->next=last;
                        //cout<<tou->val<<endl;
                        wei=last;
                        tou=wei;
                        if(last!=NULL)
                            last=last->next;
                        count=1;
                        pp=last;
                        while(count<k&&pp!=NULL)
                        {
                            count++;
                            pp=pp->next;
                        }
                        if(count==k)
                            count=1;
                        else
                            break;
                    }
                }
            return newhead;
        }
    };

     

点赞