递归删除链表节点

大家不要点进来看,只是自己留档,语言表达能力不行,但是我还是要发
自以为链表学得不算多好,至少也不差,直到复习看到了递归删除

void del_list(LinkList *&L, ElemType x) {
    LNode *p = (LNode *)malloc(sizeof(LNode));
    if (L == NULL) {
        return;
    }
    if (L->data == x) {
        p = L;
        L = L->next;  //精髓所在
        free(p);
        del_list(L, x);
    }
    else {
        del_list(L->next, x);
    }
}

第一眼看上去,我觉得链表是给删断了
递归删除并没有像普通删除那样,需要知道删除节点的前驱节点,然后让p->next=p->next->next
代码的精髓就在于引用,直接对地址进行操作在L=L->next的时候,直接就把被删除节点盖过去了,当然free还是要free的
例如:1、2、3、4
我们要对3进行删除,在L->data为2时,进入else传入L->next
2的next指向3,此时L是3也是2的next,因为这是引用对地址的操作
所以在L=L->next时,就变成了 2->next=3=3->next,不需要知道前驱节点,也可以直接删除

你可能感兴趣的:(递归删除链表节点)