leetcode/Reverse Nodes in k-Group

Reverse Nodes in k-Group Total Accepted: 24036 Total Submissions: 95219
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

You may not alter the values in the nodes, only nodes itself may be changed.

Only constant memory is allowed.

For 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

https://oj.leetcode.com/problems/reverse-nodes-in-k-group/

/**
 * 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(k==0||k==1||head==NULL||head->next==NULL){
            return head;
        }
        //计算总链表节点数量num
        ListNode *tem1=head;
        int num=0;
        for(;tem1!=NULL;num++){tem1=tem1->next;}
        
        ListNode *getlast=head;ListNode *getlast1=head;
        ListNode *reverse=head;
        ListNode *mm=head;
        while(num>=k){
            //获取欲逆序的子序列的头尾指针
            int m=k;
            ListNode *sublisthead=mm;
            ListNode *sublisttail=sublisthead;
            while(m--){
                sublisttail=sublisttail->next;
            }
            //参数为头指针,尾指针
            reverse=getreverse(sublisthead,sublisttail);
            //获取子序列头的前一个节点的指针
            m=k-1;
            getlast=reverse;
            while(m--){
                getlast=getlast->next;
            }
            
            //如果是头,直接换
            if(mm==head){
                head=reverse;
                getlast1=getlast;
            }else{
                //如果不是头,衔接起来
                getlast1->next=reverse;
                getlast1=getlast;
            }
			m = k;
			while (m--){
				reverse = reverse->next;
			}
			mm = reverse;
            num-=k;
        }
        return head;
    }
    //逆序k个节点,返回逆序序列+后边的所有序列
    ListNode *getreverse(ListNode *heade,ListNode *temphead){
        ListNode *temp=heade;
        ListNode *subhead=heade;
        temp=temp->next;
        heade->next=temphead;
        subhead=temp->next;
        while(temp!=temphead){
            temp->next=heade;
            heade=temp;
            temp=subhead;
            if(subhead!=NULL){
                subhead=subhead->next;
            }
        }
        return heade;
    }
};


你可能感兴趣的:(leetcode/Reverse Nodes in k-Group)