ListNode *reverseKGroup(ListNode *head, int k) {
        ListNode *tail = head;
        ListNode *first, *temp;

        if (k <= 1) {
            return head;
        }

        for (int i = 0; i < k; ++i) {
            if (tail == NULL) {
                return head;
            }
            tail = tail->next;
        }
        
        tail = reverseKGroup(tail, k);
        first = head;
        for (int i = 0; i < k - 1; ++i) {
            temp = first->next;
            first->next = temp->next;
            temp->next = head;
            head = temp;
        }
        first->next = tail;
        return head;
    }
Example #2
0
int main() {
    int n = 5;
    int k = 3;

    struct ListNode *head = createNode(1);
    struct ListNode *p = head;

    int i;
    for (i = 2; i <= n; i++) {
        p->next = createNode(i);
        p = p->next;
    }

    p = head;
    while (p) {
        printf("%d->", p->val);
        p = p->next;
    }
    printf("NIL\n");

    struct ListNode *new_head = reverseKGroup(head, k);

    p = new_head;
    while (p) {
        printf("%d->", p->val);
        p = p->next;
    }
    printf("NIL\n");

    return 0;
}
Example #3
0
 ListNode *reverseKGroup(ListNode *head, int k) {
     if( !head )
         return NULL;
     if( head->next==NULL || k==1)
         return head;
     int count = 0;
     ListNode *pre,*tmp,*post;
     tmp = head;
     while( tmp )
     {
         if(++count == k)
             break;
         tmp = tmp->next;
     }
     if(count < k)
         return head;
     vector<ListNode *> v;
     tmp = head;
     for(int i=0;i<k;i++)
     {
         v.push_back(tmp);
         tmp = tmp->next;
     }
     post = tmp;
     head = v.back();
     pre = head;
     for(int i=k-2;i>=0;--i)
     {
        tmp = v[i];
        pre->next = tmp;
        pre = pre->next;
     }
     pre->next = reverseKGroup(post,k);
     return head;
 }
	ListNode *reverseKGroup(ListNode *head, int k) {
		if (head == nullptr || head->next == nullptr || k < 2)
			return head;
		ListNode *next_group = head;
		//如果剩余的节点个数不足k个,则返回head
		for (int i = 0; i < k; ++i) {
			if (next_group)
				next_group = next_group->next;
			else
				return head;
		}
		// next_group is the head of next group
		// new_next_group is the new head of next group after reversion
		ListNode *new_next_group = reverseKGroup(next_group, k);
		ListNode *prev = NULL, *cur = head;
		while (cur != next_group) {
			ListNode *next = cur->next;
			//第一个节点后继指向new_next_group,后面每个节点后继指向前一个节点
			cur->next = prev ? prev : new_next_group;
			//prev和cur向后移动一个元素
			prev = cur; 
			cur = next;
		}
		return prev; // prev will be the new head of this group
	}
	ListNode *reverseKGroup(ListNode *head, int k)
	{
		if (head == nullptr || head->next == nullptr || k < 2)
			return head;
		ListNode *next_group = head;
		for (int i = 0; i < k; ++i) 
		{
			if (next_group)
				next_group = next_group->next;
			else
				return head;
		}
		// next_group is the head of next group
		// new_next_group is the new head of next group after reversion
		ListNode *new_next_group = reverseKGroup(next_group, k);
		ListNode *prev = NULL, *cur = head;
		while (cur != next_group) 
		{
			ListNode *next = cur->next;
			cur->next = prev ? prev : new_next_group;
			prev = cur;
			cur = next;
		}
		return prev; // prev will be the new head of this group
	}
Example #6
0
/*
 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 
*/
ListNode *reverseKGroup(ListNode *head, int k) {
   if(!head) return NULL;
	ListNode* cur = head;
	int i = 0;
	while(cur)
	{
		i++;
		if(i>=k) break;
		cur = cur->next;
	}
	if(i<k)
		return head;
   
	ListNode* pre = NULL;
	ListNode* next;
	cur = head;
	i = k;
	while(cur && i>0)
	{
	   next = cur->next;
	   cur->next = pre;
	   pre = cur;
	   cur = next; 
	   i--;
	}
   
	head->next = reverseKGroup(cur, k);
	//pre is the return 
	return pre;
		
	
}
Example #7
0
ListNode* reverseKGroup(ListNode* head, int k) {
	if(head == NULL || k<=1) {
		return head;
	}
	 

	ListNode* cur = head, *pre=head, *next;
	int m=1;
	
	while(m < k && cur) {
		m++;
		cur = cur->next;
	}
	if(cur) {
    	next = cur->next;
    	cur->next = NULL;
    	pre = reverseNode(head);
    	ListNode *tail = pre;
    	while(tail->next) {
    	    tail = tail->next;
    	}
    	tail->next = reverseKGroup(next, k);
	}

	
	return pre;
}
 ListNode *reverseKGroup(ListNode *head, int k) {
     //递归解法
     if (head == nullptr || k == 1){
         return head;
     }
     int len = 0;
     ListNode *count = head;
     while(count != nullptr){
         count = count -> next;
         len ++;
     }
     //当不足k个的时候,不逆转直接返回
     if (len < k){
         return head;
     }
     ListNode *cur = head -> next;
     ListNode *next = head;
     //逆转k个
     for (int i = 0; i < k - 1; i ++){
         ListNode *post = cur -> next;
         cur -> next = next;
         next = cur;
         cur = post;
     }
     //将k个后面的数传递过去继续逆转
     head -> next = reverseKGroup(cur, k);
     return next;
 }
 ListNode* reverseKGroup(ListNode* head, int k) {
     ListNode* p1 = head;
     ListNode* current = head;
     ListNode* nxt = NULL;
     ListNode* prev = NULL;
     int i = 0;
     while(p1){
         p1=p1->next;
         i++;
     }
     int n = i/k;
     if(n==0)
         return head;
     if(head == NULL)
         return head;
     int count = 0;
     while(current && count<k){
         nxt = current->next;
         current->next = prev;
         prev = current;
         current = nxt;
         count++;
     }
     if(nxt!=NULL)
         head->next = reverseKGroup(nxt,k);
     return prev;
 }
int main(int argc, char const *argv[])
{
  List L1;

  L1 = CreateEvenList(3);
  PrintList(L1);

  L1 = reverseKGroup(L1, 2);
  PrintList(L1);
  return 0;
}
 ListNode *reverseKGroup(ListNode *head, int k) {
     if(!head || k<=1) return head;
     ListNode *cur = head;
     int cnt = k;
     while(--cnt && cur->next) cur = cur->next;
     if(cnt>0) return head;
     ListNode *tmp = reverseKGroup(cur->next, k);
     cur->next = NULL;
     ListNode *newh = reverse(head);
     head->next = tmp;
     return newh;
 }
    ListNode* reverseKGroup(ListNode* head, int k) {
        auto node = head;
        // it's confusing until finding out the
        // trick that putting "!node" before "update node"
        for (int i=0; i < k; ++i) {
            if (!node) return head; // do nothing as list is too sort
            node = node->next;
        }

        auto new_head = reverse(head, node);
        head->next = reverseKGroup(node, k);
        return new_head;
    }
    ListNode *reverseKGroup(ListNode *head, int k) {
        if(head == NULL || k==1){
            return head;
        }
       	auto node = head;
        for(int i=0;i<k;++i){
            if(!node) return head;
            node = node->next;
        }
		//递归实现
        auto new_head = ReverseList(head, node);	
        head->next = reverseKGroup(node, k);
        return new_head;
    }
Example #14
0
int main()
{
	int set[] = {0, 1, 2, 3, 4, 5, 6};

	struct ListNode *res = NULL;

	int k;
	for(k = 2; k <= 7; k++)
	{
		struct ListNode *list1 = initlist(set, sizeof(set)/sizeof(int));
		res = reverseKGroup(list1, k);
		printlist(res);
	}
}
Example #15
0
 ListNode* reverseKGroup(ListNode* head, int k) {
     ListNode* pointers[k];
     for(int i=0; i<k; i++){
         pointers[i] = head;
         if(!head)   return pointers[0];
         head = head->next;
     }
     
     // reverse
     for(int i=k-1; i>0; i--){
         pointers[i]->next = pointers[i-1];
     }
     pointers[0]->next = reverseKGroup(head, k);
     return pointers[k-1];
 }
 /* recursive:
  *    C ---> B ---> A ---> D ---> E
  *    |             |      |
  *   head          end    cur
  */
 ListNode* reverseKGroup(ListNode* head, int k) {
     if (k <= 1) return head;
     ListNode *cur = head, *end = head;
     for(int i=0; i<k; i++) {
         if(!cur) return head;
         cur = cur->next;
     }
     cur = head;
     for(int i=0; i<k-1; i++) {
         cur = end->next;
         end->next = cur->next;
         cur->next = head;
         head = cur;
     }
     end->next = reverseKGroup(end->next, k);
     return head;
 }
Example #17
0
 ListNode* reverseKGroup(ListNode* head, int k) {
     ListNode *cur = head;
     for (int i=0; i<k; i++) {
         if (cur == NULL) return head;
         cur = cur->next;
     }
     
     ListNode *ret = reverseKGroup(cur, k);
     ListNode *tmp = head;
     for (int i=0; i<k; i++) {
         cur = tmp;
         tmp = tmp->next;
         cur->next = ret;
         ret = cur;
     }
     return ret;
 }
 ListNode *reverseKGroup(ListNode *head, int k) {
     if (head == nullptr || head->next == nullptr || k < 2)
         return head;
     ListNode *next_group = head;
     for (int i = 0; i < k; ++i) {
         if (next_group)
             next_group = next_group->next;
         else
             return head;
     }
     ListNode *new_next_group = reverseKGroup(next_group, k);
     ListNode *prev = NULL, *cur = head;
     while (cur != next_group) {
         ListNode *next = cur->next;
         cur->next = prev ? prev : new_next_group;
         prev = cur;
         cur = next;
     }
     return prev; 
 }
    /**
     * @param head a ListNode
     * @param k an integer
     * @return a ListNode
     */
    ListNode *reverseKGroup(ListNode *head, int k) {
        // Write your code here
        if (k == 1)
            return head;
        if (head == nullptr)
            return nullptr;
        ListNode *next;
        ListNode *new_head = nullptr;
        ListNode *new_tail = nullptr;

        int len = 0;
        ListNode *temp = head;
        while (temp) {
            len ++;
            temp = temp->next;
            if (len == k) {
                break;
            }
        }
        if (len < k)
            return head;

        int count = k;
        while (head && count-- > 0) {
            next = head->next;
            head->next = nullptr;
            if (new_head == nullptr) {
                new_head = head;
                new_tail = head;
            }
            else {
                head->next = new_head;
                new_head = head;
            }
            head = next;
        }

        ListNode *next_step_head = reverseKGroup(head, k);
        new_tail->next = next_step_head;
        return new_head;
    }
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
    if(k == 1)
        return head;
    struct ListNode *pre = NULL, *cur = head, *head_temp = head;
    for(int i = k; i > 0; --i) {
        if(cur) {
            pre = cur;
            cur = cur -> next;
        }
        else
            return head;    // 剩余结点个数不足K个时,不需要进行反转,直接返回即可
    }
    if(cur == NULL)    // 只有k个结点
        return reverseList(head);
    else {    // 结点数大于k
        pre -> next = NULL;    // 执行此步是为了执行下一步的reverseList()
        head = reverseList(head);
        head_temp -> next = reverseKGroup(cur, k);    // 递归进行余下操作
    }
    return head;
}
    ListNode* reverseKGroup(ListNode* head, int k) {
        if (head == NULL) return NULL;

        ListNode* cur = head;
        stack<ListNode*> st;
        
        for (int i = 1; i <= k && cur; i++){
            st.push(cur);
            cur = cur->next;
            if (i < k && cur == NULL) return head;
        }

        ListNode* current = head = st.top();
        st.pop();
        while(!st.empty()){
            current->next = st.top();
            st.pop();
            current = current->next;
        }
        current->next = reverseKGroup(cur, k);
        return head;

    }
// -----------------------------------------------------------------------------
//virtual
bool Solution::Test()
{
    bool pass = true;

    {
        int a[] = {};
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 0);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.empty());
    }

    {
        int a[] = {};
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 1);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.empty());
    }

    {
        int a[] = {};
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 3);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.empty());
    }

    {
        int a[] = { 1 };
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 0);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.size() == 1) && (v[0] == 1);
    }

    {
        int a[] = { 1 };
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 1);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v[0] == 1);
    }

    {
        int a[] = { 1 };
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 3);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.size() == 1) && (v[0] == 1);
    }

    {
        int a[] = { 1 };
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 1);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.size() == 1) && (v[0] == 1);
    }

    {
        int a[] = { 1, 2 };
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 0);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.size() == 2) && (v[0] == 1) && (v[1] == 2);
    }

    {
        int a[] = { 1, 2 };
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 1);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.size() == 2) && (v[0] == 1) && (v[1] == 2);
    }

    {
        int a[] = { 1, 2 };
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 2);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.size() == 2) && (v[0] == 2) && (v[1] == 1);
    }

    {
        int a[] = { 1, 2 };
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 3);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.size() == 2) && (v[0] == 1) && (v[1] == 2);
    }

    {
        int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 3);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.size() == 8) &&
            (v[0] == 3) && (v[1] == 2) && (v[2] == 1) &&
            (v[3] == 6) && (v[4] == 5) && (v[5] == 4) &&
            (v[6] == 7) && (v[7] == 8);
    }

    {
        int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
        ListNode * list = ll_create(a, sizeof(a) / sizeof(int));
        ListNode * list_reversed = reverseKGroup(list, 4);
        std::vector<int> v = ll_transform(list_reversed);
        pass = pass && (v.size() == 8) &&
            (v[0] == 4) && (v[1] == 3) && (v[2] == 2) && (v[3] == 1) &&
            (v[4] == 8) && (v[5] == 7) && (v[6] == 6) && (v[7] == 5);
    }

    return pass;
}
Example #23
0
 ListNode *swapPairs(ListNode *head) {
     // Start typing your C/C++ solution below
     // DO NOT write int main() function
     return reverseKGroup(head,2);
 }