void DeleteLink(List *L, int n) {
List *p = L->next;
List *s = L;
for (int i = 0; p != NULL; i++) {
if (i == n) {
s->next = p->next;
free(p); // 釋放節點
}
s = s->next; // 錯誤:p 已 free,s->next 可能指向已釋放記憶體
p = p->next; // 錯誤:p 已 free,訪問 p->next 未定義行為
}
}
`free(p)` 後,`p` 成為**懸空指標**。後續 `s = s->next`、`p = p->next` 皆訪問已釋放記憶體,導致未定義行為,OJ 判為 Runtime Error。
void DeleteLink(List *L, int n) {
List *p = L->next;
List *s = L;
for (int i = 0; p != NULL; i++) {
if (i == n) {
s->next = p->next; // 先斷鏈
free(p); // 再釋放
return; // 刪除單節點後直接返回,避免後續訪問
}
s = p; // 正常推進:s 跟隨 p
p = p->next;
}
}
題目要求刪除鏈表 A 中同時存在於 B 和 C 的元素。三表有序,可用**三指標同步遍歷**(類似歸併),時間複雜度 O(m+n+l),避免重複查找導致 O(m*(n+l)) 超時。