Design Pattern 7: In-place Reversal of a LinkedList | Problem: Reverse every K-element Sub-list
This commit is contained in:
		
							parent
							
								
									68a9deeb0c
								
							
						
					
					
						commit
						ce71adaf6b
					
				
							
								
								
									
										82
									
								
								7_reverse_nodes_in_k_group.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								7_reverse_nodes_in_k_group.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,82 @@
 | 
			
		||||
/* Problem: https://leetcode.com/problems/reverse-nodes-in-k-group/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
//  Below ListNode definition is copied form problem
 | 
			
		||||
struct ListNode {
 | 
			
		||||
  int val;
 | 
			
		||||
  ListNode *next;
 | 
			
		||||
  ListNode() : val(0), next(nullptr) {}
 | 
			
		||||
  ListNode(int x) : val(x), next(nullptr) {}
 | 
			
		||||
  ListNode(int x, ListNode *next) : val(x), next(next) {}
 | 
			
		||||
};
 | 
			
		||||
// Above ListNode definition is copied from problem
 | 
			
		||||
 | 
			
		||||
std::ostream &operator<<(std::ostream &out, ListNode *node) {
 | 
			
		||||
  out << "{";
 | 
			
		||||
  while (node != nullptr) {
 | 
			
		||||
    out << node->val << ", ";
 | 
			
		||||
    node = node->next;
 | 
			
		||||
  }
 | 
			
		||||
  out << "}";
 | 
			
		||||
  return out;
 | 
			
		||||
  ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ListNode *solution(ListNode *node, int k) {
 | 
			
		||||
  if (k == 1)
 | 
			
		||||
    return node;
 | 
			
		||||
  ListNode *previous_group_last_node = nullptr, *current_node = node,
 | 
			
		||||
           *head = node;
 | 
			
		||||
  while (current_node != nullptr) {
 | 
			
		||||
    ListNode *current_group_first_node = current_node;
 | 
			
		||||
    int group_nodes_count;
 | 
			
		||||
    for (group_nodes_count = 1; group_nodes_count < k; group_nodes_count++) {
 | 
			
		||||
      if (current_node->next == nullptr) {
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      current_node = current_node->next;
 | 
			
		||||
    }
 | 
			
		||||
    if (group_nodes_count == k) {
 | 
			
		||||
      ListNode *current_group_last_node = current_node,
 | 
			
		||||
               *next_group_first_node = current_node->next,
 | 
			
		||||
               *left = current_group_first_node, *right = left->next;
 | 
			
		||||
      if (head == node) {
 | 
			
		||||
        head = current_group_last_node;
 | 
			
		||||
      }
 | 
			
		||||
      while (right != next_group_first_node) {
 | 
			
		||||
        ListNode *tmp = right->next;
 | 
			
		||||
        right->next = left;
 | 
			
		||||
        left = right;
 | 
			
		||||
        right = tmp;
 | 
			
		||||
      }
 | 
			
		||||
      if (previous_group_last_node != nullptr) {
 | 
			
		||||
        previous_group_last_node->next = current_group_last_node;
 | 
			
		||||
      }
 | 
			
		||||
      previous_group_last_node = current_group_first_node;
 | 
			
		||||
      current_group_first_node->next = next_group_first_node;
 | 
			
		||||
      current_node = next_group_first_node;
 | 
			
		||||
    } else {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return head;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ListNode *vector_to_list(std::vector<int> &&vec) {
 | 
			
		||||
  ListNode *head = nullptr;
 | 
			
		||||
  for (int i = vec.size() - 1; i >= 0; i--) {
 | 
			
		||||
    head = new ListNode(vec[i], head);
 | 
			
		||||
  }
 | 
			
		||||
  return head;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  std::cout << solution(vector_to_list({1, 2, 3, 4, 5}), 2) << std::endl
 | 
			
		||||
            << solution(vector_to_list({1, 2, 3, 4, 5}), 3) << std::endl
 | 
			
		||||
            << solution(vector_to_list({1, 2, 3, 4, 5}), 4) << std::endl;
 | 
			
		||||
  ;
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
@ -16,3 +16,5 @@ add_executable(3_squares_of_a_sorted_array 3_squares_of_a_sorted_array.cpp)
 | 
			
		||||
add_executable(5_conflicting_appointments 5_conflicting_appointments.cpp)
 | 
			
		||||
 | 
			
		||||
add_executable(6_find_all_missing_numbers 6_find_all_missing_numbers.cpp)
 | 
			
		||||
 | 
			
		||||
add_executable(7_reverse_nodes_in_k_group 7_reverse_nodes_in_k_group.cpp)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user