-
Notifications
You must be signed in to change notification settings - Fork 37
/
Copy pathlinked_list.hpp
170 lines (145 loc) · 4.7 KB
/
linked_list.hpp
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#pragma once
#include <cassert> // assert
#include <stdexcept> // out_of_range
#include <string> // to_string
namespace itis {
/**
* Структура "узел".
* Хранит в себе данные и указатель на следующий узел.
*/
struct Node {
char data;
Node *next_; // указатель на следующий узел
};
struct LinkedList {
public:
// default constructor
LinkedList() = default;
~LinkedList() {
// To Do ...
}
/**
* Добавление элемента в конец списка.
* Сложность операции - O(1).
*
* @param element - значение элемента
*/
void PushBack(char element) {
// To Do ...
}
/**
* Вставка элемента в список по индексу.
* Сложность операции вставки - O(1).
* Сложность операции поиска узла - O(n).
*
* @param index - позиция для вставки
* @param element - значение элемента
*
* @throws выбрасывает ошибку out_of_range при работе с некорректным индексом.
*/
void Insert(int index, char element) {
check_out_of_range(index);
// To Do ...
}
/**
* Удаление элемента списка по индексу.
* Сложность операции удаления - O(1).
* Сложность операции поиска узла - O(n).
*
* @param index - индекс удаляемого элемента
* @return значение удаленного элемента
*
* @throws выбрасывает ошибку out_of_range при работе с некорректным индексом.
*/
char Remove(int index) {
check_out_of_range(index);
// To Do ...
return {};
}
/**
* Удаление всех элементов списка. Сложность операции - O(n).
*/
void Clear() {
// To Do ...
}
/**
* Получение элемента списка по индексу.
* Сложность операции - O(n).
*
* @param index - индекс элемента
* @return значение элемента по индексу
*
* @throws выбрасывает ошибку out_of_range при работе с некорректным индексом.
*/
char Get(int index) const {
check_out_of_range(index);
// To Do ...
return {};
}
/**
* Вычисление индекса элемента.
* Сложность операции - O(n).
*
* @param element - значение элемента
* @return индекс элемента или -1 при остутствии элемента в списке
*/
int IndexOf(char element) const {
// To Do ...
return {};
}
/**
* Проверка наличия хотя бы одного элемента в массиве.
* Сложность операции - O(1).
*
* @return при наличии хотя бы одного элемента - true, иначе - false
*/
bool IsEmpty() const {
// To Do ...
return {};
}
int GetSize() const {
return size_;
}
int GetCapacity() const {
return size_;
}
private:
/**
* Поиск узла списка по значению элемента.
* Сложность операции - O(n).
*
* Если в списке несколько элементов с одинаковым значением,
* то возвращается первый встретившийся узел.
*
* @param element - значение элемента в узле
* @return указатель на узел или nullptr - при отсутствии узла с таким значением
*/
Node *find_node(char element) const {
// To Do ...
return nullptr;
}
/**
* Поиск узла списка по значению элемента.
* Сложность операции - O(n).
*
* @param element - значение элемента в узле
* @return указатель на узел или nullptr - при отсутствии узла с таким значением
*/
Node *find_node(int index) const {
assert(index >= 0 && index < size_);
// To Do ...
return nullptr;
}
private:
int size_{0};
Node *head_{nullptr};
Node *tail_{nullptr};
void check_out_of_range(int index) const;
};
// реализация методов
void LinkedList::check_out_of_range(int index) const {
if (index >= size_) {
throw std::out_of_range("index is out of range: " + std::to_string(size_));
}
}
} // namespace itis