Summary Files Commits Branches @commit @diff @stats
path: root / Year 2 / Structures and data algorithms / Exam 1 / ex2.cpp
blob: 99128d0af659b34aded904e2dc1b5a7f508e1a04 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>

template <typename T>
struct Node {
	T value;
	Node<T>* next;

	Node(T value, Node<T>* next = nullptr) : value(value), next(next) {}
};


bool makeTotal(Node<int>* head) {
	int len = 0;
	for (Node<int>* i = head; i != nullptr; i = i->next)
		len++;
	if (len < 3) return false;

	Node<int>* prev = head;
	Node<int>* next = head->next->next;
	head = head->next;
	bool balanced = true;
	while (next != nullptr) {
		if (prev->value + next->value != head->value) {
			balanced = false;
			break;
		}

		prev = prev->next;
		head = head->next;
		next = next->next;
	}

	if (!balanced) {
		prev->next = next;
		delete head;
		makeTotal(prev);
	}
	return balanced;
}

int main() {
	// Node<int>* list = new Node<int>(1, new Node<int>(-4, new Node<int>(-5, new Node<int>(-1, new Node<int>(4)))));
	Node<int>* list = new Node<int>(10, new Node<int>(-5, new Node<int>(-5, new Node<int>(-15, new Node<int>(2)))));

	std::cout << makeTotal(list) << std::endl;
	for (Node<int>* i = list; i != nullptr; i = i->next)
		std::cout << i->value << " ";
	std::cout << std::endl;

	Node<int>* tmp = nullptr;
	while (list != nullptr) {
		tmp = list->next;
		delete list;
		list = tmp;
	}
}