Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. struct Node { Node *next; int val; };
  4.  
  5. bool broken(Node *a, Node *b, bool growing) {
  6.     if (growing) return a->val > b->val;
  7.     return a->val < b->val;
  8. }
  9.  
  10. Node* insert(Node *head, Node *elem, bool growing) {
  11.     if (head == nullptr || !broken(elem, head, growing)) {
  12.         elem->next = head;
  13.         return elem;
  14.     }
  15.  
  16.     Node *p = head;
  17.     while (p->next != nullptr && !broken(p->next, elem, growing))
  18.         p = p->next;
  19.  
  20.     elem->next = p->next;
  21.     p->next = elem;
  22.  
  23.     return head;
  24. }
  25.  
  26. Node* fromArray(int t[], int n) {
  27.     Node *head = new Node { nullptr, t[0] };
  28.     Node *last = head;
  29.    
  30.     for (int i = 1; i < n; i++) {
  31.         Node *tmp = new Node { nullptr, t[i] };
  32.         last->next = tmp;
  33.         last = tmp;
  34.     }
  35.     return head;
  36. }
  37.  
  38. bool isGrowing(Node *L) {
  39.     int numBigger = 0;
  40.     Node *n = L;
  41.     for (int i = 0; i < 3; i++) {
  42.         if (n->val < n->next->val) numBigger++;
  43.         else numBigger--;
  44.         n = n->next;
  45.     }
  46.  
  47.     return numBigger > 0;
  48. }
  49.  
  50. Node* fixSortedList(Node *L) {
  51.     // dla list dlugosci < 3 nie ma co sortowac
  52.     if (L == nullptr || L->next == nullptr || L->next->next == nullptr) return L;
  53.  
  54.     // dla list dlugosci 3 wystarczy wsadzic te 3 wskazniki zeby posortowac wsio jak
  55.     if (L->next->next->next == nullptr) {
  56.         Node *n = insert(L->next->next, nullptr, false);
  57.         n = insert(L->next, n, false);
  58.         return insert(L, n, false);
  59.     }
  60.  
  61.     // tu dochodzimy dla dlugosci wiekszej niz 3
  62.     bool growing = isGrowing(L);
  63.  
  64.     Node *prevBig = nullptr;
  65.  
  66.     Node *p = L, *prev = nullptr;
  67.  
  68.     while (p->next != nullptr) {
  69.         if (broken(p, p->next, growing)) {
  70.             if (prevBig == nullptr) {
  71.                 prevBig = prev;
  72.                 break;
  73.             }
  74.         }
  75.  
  76.         prev = p;
  77.         p = p->next;
  78.     }
  79.  
  80.     if (prevBig == nullptr) return insert(L->next, L, growing);
  81.     else {
  82.         Node *big = prevBig->next;
  83.         prevBig->next = big->next;
  84.         return insert(L, big, growing);
  85.     }
  86. }
  87.  
  88.  
  89. bool sorted(Node *head) {
  90.     if (head == nullptr || head->next == nullptr) return true;
  91.     return head->val < head->next->val && sorted(head->next);
  92. }
  93.  
  94. void print(Node *n, bool first = true) {
  95.     if (n == nullptr) return;
  96.     std::cout << n->val << " ";
  97.     print(n->next, false);
  98.     if (first) std::cout << std::endl;
  99. }
  100.  
  101. int main() {
  102.     Node *n = fromArray(new int[5] {8, 3, 5, 4, 2}, 5);
  103.  
  104.     print(n);
  105.     Node *nn = fixSortedList(n);
  106.     print(nn);
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement