目錄
單鏈表的存儲結構定義如下
快慢指針法
三指針法版本①
三指針法版本②?
單鏈表的存儲結構定義如下
typedef struct{Elemtype data;struct Node* next;
}LNode,*LinkList;
快慢指針法
void deleteprex(LinkList L, Elemtype e) {if (L == NULL || L->next == NULL || L->next->next == NULL) {return; // 鏈表為空、只有一個節點或兩個節點,無法刪除前驅節點}LinkList q = L; // 慢指針,指向當前節點的前驅LinkList p = L->next; // 快指針,用于查找值為e的節點// 檢查第一個數據節點是否是目標節點(此時沒有前驅節點)if (p->data == e) {return; // 無法刪除前驅節點,直接返回}// 從第二個數據節點開始遍歷p = p->next; // p指向第二個數據節點while (p != NULL) {if (p->data == e) {// 找到值為e的節點,刪除其前驅節點(即q的下一個節點)LinkList temp = q->next;q->next = p;free(temp);return; // 只刪除第一個出現的節點的前驅,處理完后立即返回}// 未找到,指針后移q = q->next;p = p->next;}
}
三指針法版本①
int DelNodeX_L(LinkList &L, ElemType x) {// 初始化指針:prepre 指向頭結點,pre 指向第二個結點,p 待初始化LinkList prepre = L, pre = prepre->next, p; // 若第二個結點值就是 x,無有效前驅可刪,返回失敗if (pre->data == x) return 0; // p 指向第三個結點,開始遍歷找值為 x 的結點p = pre->next; while (p != NULL && p->data != x) { // 指針后移:prepre → pre → pprepre = pre; pre = p; p = p->next; } // 找到值為 x 的結點(p 非空),刪除其前驅(pre)if (p != NULL) { // prepre 跳過 pre,直接指向 pprepre->next = p; // 釋放前驅結點內存free(pre); // 返回刪除成功return 1; } else { // 未找到值為 x 的結點,返回失敗return 0; }
}
三指針法版本②
void deleteprex(LinkList L, Elemtype e) {if (L == NULL || L->next == NULL || L->next->next == NULL) {return; // 鏈表為空、只有一個節點或兩個節點,不可能存在前驅節點}LinkList pre = L; // 前驅節點的前驅(用于刪除操作)LinkList cur = L->next; // 當前節點,用于查找值為e的節點// 檢查第一個數據節點是否是目標節點(此時沒有前驅節點)if (cur->data == e) {return; // 無法刪除前驅節點,直接返回}// 從第二個數據節點開始遍歷LinkList next = cur->next;while (next != NULL) {if (next->data == e) {// 找到值為e的節點,刪除其前驅節點(即cur)pre->next = next;free(cur);return; // 只刪除第一個出現的節點的前驅,處理完后立即返回}// 未找到,指針后移pre = cur;cur = next;next = next->next;}
}