採用帶頭節點的單鏈表結構,頭節點 `first` 的 `data` 域存儲鏈表長度,`last` 指向尾節點,實現 O(1) 尾插。所有操作基於模板 `Type`,支援任意可比較類型。
template <class Type>
class ListNode {
friend class List<Type>;
Type data;
ListNode *next;
ListNode(Type d = Type(), ListNode *n = nullptr)
: data(d), next(n) {}
};
template <class Type>
class List {
ListNode<Type> *first, *last;
public:
List() { first = last = Buynode(); }
~List() { destroy(); }
// 13 項核心操作...
protected:
ListNode<Type>* Buynode(Type x = Type()) {
return new ListNode<Type>(x);
}
};
void push_back(const Type &x) {
ListNode<Type> *s = Buynode(x);
last->next = s;
last = s;
first->data++; // 長度++
}
void push_front(const Type &x) {
ListNode<Type> *s = Buynode(x);
s->next = first->next;
first->next = s;
if (first == last) last = s; // 空表情況
first->data++;
}
void insert_val(const Type &x) {
ListNode<Type> *s = Buynode(x);
ListNode<Type> *p = first->next;
if (!p || p->data > s->data) { push_front(s->data); return; }
if (last->data < s->data) { push_back(s->data); return; }
while (p->next && p->next->data < x) p = p->next;
s->next = p->next;
p->next = s;
first->data++;
}
void reserv() {
ListNode<Type> *p = first->next;
if (!p) return;
ListNode<Type> *curr = p->next;
p->next = nullptr;
last = p;
while (curr) {
ListNode<Type> *tmp = curr->next;
curr->next = p;
p = curr;
curr = tmp;
}
first->next = p;
}
void sort() {
for (ListNode<Type> *s = first->next; s->next; s = s->next)
for (ListNode<Type> *p = s; p->next; p = p->next)
if (s->data > p->next->data)
swap(s->data, p->next->data);
}
同順序表,提供完整的菜單驅動測試框架,驗證所有 13 項操作。
| 操作 | 時間複雜度 | 備註 |
|---|---|---|
| push_back/push_front | O(1) | 得益於 last 指針與頭節點 |
| pop_back | O(n) | 單鏈表無前驅,需遍歷 |
| insert_val/delete_val | O(n) | 有序表可優化至 O(log n) + O(1) 若用跳表 |
| reserv/sort | O(n)/O(n²) | 排序建議改用歸併排序 O(n log n) |