Advertisement
ParkinMsu

task4

Jun 27th, 2016
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <memory>
  5. #include <cmath>
  6.  
  7. /*
  8. Имеется простой односвязный список размера N. Необходимо реализовать алгоритм, который перепаковывает список так,
  9. чтобы за первым элеметом следовал последний, затем второй, затем предпоследний и т. д.
  10. Пример работы алгоритма:
  11. исходный список: 1-2-3-4-5-6-7-8
  12. перепакованный список: 1-8-2-7-3-6-4-5.
  13. Оценить сложность предложенного алгоритма.
  14. */
  15.  
  16. class Node
  17. {
  18. public:
  19.     int val;
  20.     std::shared_ptr<Node> next;
  21.     Node(int v) : val(v), next(nullptr) {};
  22. };
  23.  
  24. class List
  25. {
  26. public:
  27.     List():size(0), head(nullptr){};
  28.     void add(int value);
  29.     std::shared_ptr<Node> get_head();
  30.     int get_size();
  31.  
  32. private:
  33.     int size;
  34.     std::shared_ptr<Node> head;
  35. };
  36.  
  37. void
  38. List::add(int value)
  39. {
  40.     if (head != nullptr){
  41.         std::shared_ptr<Node> curr = head;
  42.         while(curr->next != nullptr){
  43.             curr = curr->next;
  44.         }
  45.         std::shared_ptr<Node> tmp_ptr(new Node(value));
  46.         curr->next = tmp_ptr;
  47.         size++;
  48.     } else {
  49.         std::shared_ptr<Node> tmp_ptr(new Node(value));
  50.         head = tmp_ptr;
  51.         size++;
  52.     }
  53. }
  54.  
  55. std::shared_ptr<Node>
  56. repack(std::shared_ptr<Node> head, int size)
  57. {
  58.     if (size < 2){
  59.         return head;
  60.     }
  61.  
  62.     std::shared_ptr<Node> middle_ptr(head);
  63.     bool is_odd = size % 2;
  64.     int n = std::ceil(size / 2.0);
  65.     for ( ;n > 1; n--, middle_ptr = middle_ptr->next);
  66.     std::shared_ptr<Node> tmp_ptr(middle_ptr);
  67.     middle_ptr = middle_ptr->next;
  68.     tmp_ptr->next = nullptr;
  69.  
  70.     std::shared_ptr<Node> reverse_head(new Node(middle_ptr->val));
  71.     middle_ptr = middle_ptr->next;
  72.     while(middle_ptr != nullptr){
  73.         tmp_ptr.reset(new Node(middle_ptr->val));
  74.         tmp_ptr->next = reverse_head;
  75.         reverse_head = tmp_ptr;
  76.         middle_ptr = middle_ptr->next;
  77.     }
  78.    
  79.     std::shared_ptr<Node> curr(head);
  80.     tmp_ptr.reset();
  81.     std::shared_ptr<Node> tmp_reverse_ptr;
  82.  
  83.     while(curr != nullptr && reverse_head != nullptr){
  84.         tmp_ptr = curr->next;
  85.         curr->next = reverse_head;
  86.         tmp_reverse_ptr = reverse_head->next;
  87.         reverse_head->next = tmp_ptr;
  88.         curr = tmp_ptr;
  89.         reverse_head = tmp_reverse_ptr;
  90.     }
  91.  
  92.     if (is_odd){
  93.         curr->next = nullptr;
  94.     }
  95.  
  96.     return head;
  97. }
  98.  
  99. std::shared_ptr<Node>
  100. List::get_head()
  101. {
  102.     return head;
  103. }
  104.  
  105. int
  106. List::get_size()
  107. {
  108.     return size;
  109. }
  110.  
  111. void print_list(std::shared_ptr<Node> head)
  112. {
  113.     std::shared_ptr<Node> curr(head);
  114.     while(curr != nullptr){
  115.         std::cout << curr->val << " ";
  116.         curr = curr->next;
  117.     }
  118.     std::cout << std::endl;
  119. }
  120.  
  121. int main(int argc, char** argv)
  122. {
  123.     List l;
  124.     l.add(1);
  125.     l.add(2);
  126.     l.add(3);
  127.     l.add(4);
  128.     l.add(5);
  129.     std::shared_ptr<Node> list_head = l.get_head();
  130.     print_list(list_head);
  131.     std::shared_ptr<Node> repack_list = repack(list_head, l.get_size());
  132.     print_list(repack_list);
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement