删除单链表L中p所指向结点的前驱结点

删除单链表L中p所指向结点的前驱结点。程序不会写,想请大家帮我想想怎么解释

思路:遍历单链表,判断指针的下下个节点是否和p相同,相同就删除下个节点,下面是一个简单的示例:

struct NodeList{
    int item;
    struct NodeList *next;
};

void rmPrev(struct NodeList* L, struct NodeList *p){
    struct NodeList* temp = L;
    while(temp->next != NULL){
        if (temp->next->next == NULL)break;
        else if(temp->next->next == p){
            temp->next = p;
            break;
        }
    }
}

void deletePredecessor(ListNode *L, ListNode *p) {
    if (L == NULL || p == NULL || L->next == NULL) {
        return;
    }

    ListNode *pre = L;
    ListNode *cur = L->next;

    while (cur != NULL) {
        if (cur == p) {
            pre->next = cur->next;
            free(cur);
            return;
        }
        pre = cur;
        cur = cur->next;
    }
}
 
void deletePredecessor(ListNode *Head, ListNode *p) {
 
    ListNode *pre = Head;//前驱的前驱
    ListNode *q;//要删除的前驱节点
 
    while (pre != NULL && pre->next !=NULL) {
        if (pre->next->next == p) {
            q=pre->next;
            pre->next = p;
            free(q);
            break;
        }
        pre = pre->next;
    }
}

这里没有判断p的前驱是head的可能,如果head里也能存数据,删起来会很麻烦