| 建立方式 | 插入點 | 頭指標變化 | 尾指標需求 | 時間複雜度(單次插入) |
|---|---|---|---|---|
| 順序建立(尾插法) | 鏈表尾部 | 僅首節點建立時設定 | 需維護 tail 指標,否則每次遍歷 O(n) | O(1) 有 tail / O(n) 無 tail |
| 逆序建立(頭插法) | 鏈表頭部 | 每次插入皆更新 head | 不需要 | O(1) |
Node* head = nullptr;
for (int val : values) {
Node* node = new Node(val);
node->next = head;
head = node; // 新節點成為新頭
}
// 結果:鏈表順序與輸入順序相反
Node* head = nullptr;
Node* tail = nullptr;
for (int val : values) {
Node* node = new Node(val);
if (!head) head = tail = node;
else {
tail->next = node;
tail = node;
}
}
// 結果:鏈表順序與輸入順序一致
現代 C++ 專案極少手寫鏈表。std::list/std::forward_list 提供:
push_back/push_front 均 O(1),無需手動管理指標。手寫鏈表僅為教學練習(理解指標、記憶體佈局、遞迴),生產環境請直接用標準容器。
本質差異在於插入端點。逆序建立(頭插)碼簡、O(1) 但順序反轉;順序建立(尾插)順序正確但需尾指標。實務上:學習階段理解兩種模式,生產階段用 std::list/forward_list。