|
2 | 2 | import leetcode_test.split_a_circular_linked_list.Solution;
|
3 | 3 | import leetcode_test.split_a_circular_linked_list.ArrayToCircularLinkedList;
|
4 | 4 | import leetcode_test.split_a_circular_linked_list.CircularLinkedListToArray;
|
| 5 | +import leetcode_test.split_a_circular_linked_list.TraversalCircularListNode; |
5 | 6 | #include <gtest/gtest.h>
|
| 7 | +#include <iterator> |
| 8 | +#include <unordered_set> |
6 | 9 | #include <vector>
|
7 | 10 | using std::ranges::views::transform;
|
8 | 11 | using namespace leetcode_test::split_a_circular_linked_list;
|
| 12 | +using namespace std; |
9 | 13 | using std::vector;
|
10 |
| - |
11 | 14 | template <class T>
|
12 |
| -concept sized = requires(T& t) { |
| 15 | +concept sizable = requires(T& t) { |
13 | 16 | {
|
14 | 17 | t.size()
|
15 | 18 | } -> std::same_as<size_t>;
|
16 | 19 | };
|
| 20 | +template <class T> |
| 21 | +concept iterable = requires(T& t) { |
| 22 | + ++t.begin(); |
| 23 | + { |
| 24 | + t.begin() != t.end() |
| 25 | + |
| 26 | + } -> std::same_as<bool>; |
| 27 | +}; |
17 | 28 |
|
18 | 29 | template <class T, typename Y>
|
19 | 30 | concept equalable = requires(T& t, Y& y, size_t i) {
|
20 | 31 | {
|
21 |
| - t[i] == y[i] |
| 32 | + *t.begin() == *y.begin() |
22 | 33 | } -> std::same_as<bool>;
|
23 | 34 | };
|
24 | 35 | template <typename T, typename Y>
|
25 |
| - requires sized<T> and sized<Y> and equalable<T, Y> |
| 36 | + requires sizable<T> and sizable<Y> and equalable<T, Y> and iterable<T> and iterable<Y> |
26 | 37 | auto assertContentEquals(T& left, Y& right)
|
27 | 38 | {
|
28 | 39 |
|
29 | 40 | ASSERT_EQ(
|
30 | 41 | left.size(),
|
31 | 42 | right.size());
|
32 |
| - for (auto i = 0; i < left.size(); ++i) { |
33 |
| - ASSERT_EQ(left[i], right[i]); |
| 43 | + auto a = left.begin(); |
| 44 | + auto b = right.begin(); |
| 45 | + for (; b != right.end() && a != left.end(); ++a, ++b) { |
| 46 | + |
| 47 | + ASSERT_EQ(*a, *b); |
34 | 48 | }
|
35 | 49 | }
|
36 | 50 | TEST(split_a_circular_linked_list, test1)
|
37 | 51 | {
|
38 | 52 | auto input = vector<int> { 1, 5, 7 };
|
39 | 53 | auto output = vector<vector<int>> { { 1, 5 }, { 7 } };
|
40 | 54 | auto* list = ArrayToCircularLinkedList(input);
|
| 55 | + |
| 56 | + auto nodes = unordered_set<ListNode*> {}; |
| 57 | + TraversalCircularListNode(list, [&](auto* node) { nodes.insert(node); }); |
41 | 58 | auto result = Solution().splitCircularLinkedList(list) | transform(CircularLinkedListToArray);
|
42 | 59 |
|
43 | 60 | assertContentEquals(result, output);
|
| 61 | + |
| 62 | + for (auto* node : nodes) { |
| 63 | + delete node; |
| 64 | + } |
44 | 65 | }
|
45 | 66 | TEST(split_a_circular_linked_list, test2)
|
46 | 67 | {
|
47 | 68 | auto input = vector<int> { 2, 6, 1, 5 };
|
48 | 69 | auto output = vector<vector<int>> { { 2, 6 }, { 1, 5 } };
|
49 | 70 | auto* list = ArrayToCircularLinkedList(input);
|
50 | 71 | auto result = Solution().splitCircularLinkedList(list) | transform(CircularLinkedListToArray);
|
51 |
| - |
| 72 | + auto nodes = unordered_set<ListNode*> {}; |
| 73 | + TraversalCircularListNode(list, [&](auto* node) { nodes.insert(node); }); |
52 | 74 | assertContentEquals(result, output);
|
| 75 | + for (auto* node : nodes) { |
| 76 | + delete node; |
| 77 | + } |
53 | 78 | }
|
54 | 79 |
|
55 | 80 | int main(int argc, char** argv)
|
|
0 commit comments