链表:递归中删除结点不发生断链

  • 这是使用递归(使用引用)进行删除节点的内存变化
void Del_x(LinkList &L, int x) {//引用
    if (L == NULL) {//空结点
        return;
    }
    LNode *p;
    if (L->element == x) {
        p = L;
        printf("address of L:%p\n", &L);
        printf("value of L->next:%p\n", L->next);
        L = L->next;  //L相当于L的前一个节点.next
        delete p;
        Del_x(L, x);
    }
    else {
        Del_x(L->next, x);
    }
}

这里写图片描述
可以看到这里,L=L->next 可以理解为将L的next的值(下个节点的地址)赋值到L地址上(这里L的地址也就是L1->next的地址)。
因为上层函数调用的是(L1->next,x),因为是引用的关系,直接L看成是L1->next就行了,那么就是L1->next=L->next,和正常的一样了


  • 这是不使用递归正常的删除结点的方法
LNode *p = start->next;
    LNode *q = p->next;
    printf("address of p->next:%p\n", &(p->next));
    printf("value of q:%p\n", q->next);
    p->next = q->next;
    delete q;

这里写图片描述


  • 这是使用递归方法的中删除节点方式,但是非递归
p = start->next;
    printf("address of p:%p\n", &p);
    printf("value of p:%p\n", p->next);
    p = p->next;

这里写图片描述

这里并非引用,这样做的结果只会导致,原本q地址上存放的是第二个节点的地址(start—>next)变成了第三个节点的地址(p->next)


总的来说是因为对引用的使用不够精确的了解

参考:引用的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值