當頻繁隨機存取、元素數量較固定、記憶體空間敏感(無指標開銷)時,順序表更優。
原算法以巢狀迴圈逐個移動,時間複雜度 O(k·n)。改進:一次性將後續元素前移 k 位,再更新 length,複雜度降為 O(n)。
Status DeleteK(SqList &L, int i, int k) {
if (i < 1 || k < 0 || i + k > L.length) return INFEASIBLE;
for (int j = i + k; j <= L.length; ++j)
L.elem[j - k - 1] = L.elem[j - 1];
L.length -= k;
return OK;
}
先二分查找插入位置,再後移元素,最後插入。時間複雜度 O(log n + n) ≈ O(n)。
同步掃描兩表,首個不同元素決定大小;若一表提前結束則該表較小。無需顯式求前綴。
利用有序性,找到首個 > mink 的前驅 pre,與首個 ≥ maxk 的節點 rear,將 pre->next 接到 rear,並釋放中間節點。單次掃描 O(n)。
三指標法:pre 初為 NULL,cur 為首節點,next 暫存後繼;迴圈中反轉 cur->next 指向 pre,三指標同步後移。O(n) 時間、O(1) 空間。
雙指標比較,每次取較大節點摘離插入新表頭部(頭插法),最後自動形成遞減序。O(m+n) 時間、無額外空間。
先將奇數位節點摘出串成子表,偶數位節點逆序插入奇數子表尾部。一次遍歷完成,O(n) 時間。
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct { ElemType *elem; int length, listsize; } SqList;
typedef struct LNode { ElemType data; struct LNode *next; } LNode, *LinkList;
本文彙整教材習題核心解法,適合備考資料結構考試或面試複習。完整程式碼與測試數據請參考原書配套資源。