1 #include <cassert>
2 #include <iostream>
3
4 using namespace std;
5
6 struct SingleListNode {
7 int val;
8 SingleListNode *next;
9 SingleListNode(int x) :
10 val(x), next(nullptr) {
11 }
12 SingleListNode(int x, SingleListNode* pn) {
13 val = x;
14 next = pn;
15 }
16 };
17
18 class SingleList {
19 private:
20 SingleListNode *m_head;
21 int m_length;
22 public:
23 SingleList() {
24 m_head = nullptr;
25 m_length = 0;
26 }
27 ~SingleList() {
28 while (m_head) {
29 SingleListNode *p = m_head->next;
30 delete m_head;
31 m_head = p;
32 }
33 }
34 //插入
35 void insert(int index, const int Ele) {
36 assert(index > 0 && index < m_length + 2);
37 if (index == 1) {
38 m_head = new SingleListNode(Ele, m_head);
39 } else {
40 SingleListNode *p = m_head;
41 while (index > 2) {
42 p = p->next;
43 index--;
44 }
45 p->next = new SingleListNode(Ele, p->next);
46 }
47 m_length++;
48 }
49
50 //删除操作:
51 //-1:error 0:correct
52 int erase(int index) {
53 if (index < 1 || index > m_length) {
54 return -1;
55 }
56 SingleListNode *p = m_head;
57 if (index == 1) {
58 m_head = m_head->next;
59 delete p;
60 } else {
61 while (index > 2) {
62 index--;
63 p = p->next;
64 }
65 SingleListNode* tmp = p->next;
66 p->next = p->next->next;
67 delete tmp;
68 }
69 m_length--;
70 return 0;
71 }
72 int getlength() {
73 return m_length;
74 }
75
76 void print() {
77 SingleListNode* p = m_head;
78 while (p) {
79 cout << p->val << "->";
80 p = p->next;
81 }
82 cout << endl;
83 }
84
85 //插入排序
86 void insertSort() {
87 SingleListNode* fake = new SingleListNode(-1, m_head); //建一个假的节点
88 if (m_head->next == nullptr) return;
89 SingleListNode* cur = m_head->next;
90 SingleListNode* cur_next = cur->next;
91 SingleListNode* cur_pre = m_head;
92 while (cur) {
93 SingleListNode *p = fake;
94 while (p->next != cur) {
95 if (cur->val < p->next->val) {
96 SingleListNode* tmp = p->next;
97 p->next = cur;
98 cur->next = tmp;
99 cur_pre->next = cur_next;
100 cur = cur_next;
101 if (cur)
102 cur_next = cur->next;
103 break;
104 } else {
105 p = p->next;
106 }
107 }
108 if (p->next == cur) {
109 cur_pre = cur;
110 cur = cur_next;
111 if (cur)
112 cur_next = cur->next;
113 }
114 }
115 m_head = fake->next;
116 }
117
118 //归并排序
119 void mergeSort() {
120 m_head = mergeSort(m_head);
121 }
122
123 //链表翻转
124 void reverse() {
125 if (!m_head || !m_head->next)
126 return;
127 SingleListNode* cur = m_head->next;
128 SingleListNode* cur_next;
129 m_head->next = nullptr;
130 while (cur) {
131 cur_next = cur->next;
132 cur->next = m_head;
133 m_head = cur;
134 cur = cur_next;
135 }
136 }
137 private:
138 SingleListNode* mergeSort(SingleListNode* head) {
139 if (head == nullptr || head->next == nullptr)
140 return head; //less 2 nodes
141 SingleListNode* slow = head;
142 SingleListNode* fast = head;
143 SingleListNode* pre = head;
144 while (fast && fast->next) {
145 pre = slow;
146 slow = slow->next;
147 fast = fast->next->next;
148 }
149 pre->next = nullptr;
150 cout << slow->val << endl;
151 return merge(mergeSort(head), mergeSort(slow));
152 }
153
154 SingleListNode* merge(SingleListNode* l1, SingleListNode* l2) {
155 SingleListNode* dummy = new SingleListNode(-1);
156 SingleListNode* cur = dummy;
157 while (l1 && l2) {
158 if (l1->val < l2->val) {
159 cur->next = l1;
160 l1 = l1->next;
161 } else {
162 cur->next = l2;
163 l2 = l2->next;
164 }
165 cur = cur->next;
166 }
167 if (l1)
168 cur->next = l1;
169 if (l2)
170 cur->next = l2;
171 return dummy->next;
172 }
173
174 };
175
176 void insertSort(int a[], int n) {
177 int temp;
178 for (int i = 1; i < n; i++) {
179 temp = a[i];
180 int j = i - 1;
181 while (j > -1 && temp < a[j]) {
182 a[j + 1] = a[j];
183 j--;
184 }
185 a[j + 1] = temp;
186 }
187 }
188
189 int main() {
190 SingleList l = SingleList();
191 l.insert(1, 2);
192 l.insert(1, 3);
193 l.insert(1, 1);
194 l.insert(2, 0);
195 l.print();
196 l.mergeSort();
197 // l.insertSort();
198 // l.mergeSort();
199 // l.reverse();
200 l.print();
201 return 0;
202 }