面试题:如何删除单链表某节点

面试中遇到的单链表删除节点问题,不能直接通过前驱节点操作。介绍了一种‘狸猫换太子’的算法,通过复制下一个节点的数据到当前节点,然后更新指针并释放原节点,解决了无法获取前驱节点的问题。但需要注意防止内存泄漏和重复释放的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想起之前面试,有个面试官给出了一个单链表的head头指针,以及要删除的p节点,让我说出要如何删除该p节点。

我爽快的说,只需要获取到p节点的前驱结点p->pre,  p->pre->next  = p->next.  free(p),考官说,是单链表,不是双链表、

我又迅速地说,那就借助head指针,一直找,找到p节点,并保留p的前一个指针不就可以了。

考官说,要是这个链表数据很多,这样做,会有点慢,让我再想想,相当于提供了一个不知道头结点的单链表。


后来网路上看到别人说有一种叫狸猫换太子的算法,可以巧妙地删除某一个链表的节点(非尾节点)。

架设有个一链表   head - > A -> B -> C -> D -> E -> F -> G ->  NULL,要删除 C 节点,指向 C 节点的指针叫 pDelet,

思路:用 C 节点的下一个 节点 D 来作为要删除的节点。将 D 节点的 data 传给 C 节点的 data ,再将 C 的 next 指针指向 D 的next 节点,释放 D 节点。

即:       pDelet->data = pDelet->next->data;

              pDelet->next = pDelet->nexxt->next;

               free(pDelet);

算法如下:

woid DeletOneNode(node *p)

{

        Assert(p != NULL);

       node * pNext = p->next;

       if(pNext  != NULL){  //判断要删除的节点是不是最后一个节点

                 p->data = pNext->data;

                 p ->next = pNext->next;

                 free(pNext);

     }else{    //p是尾节点

               printf("This is the Rear node,you can't delete it");

    }

}


但是,一般涉及到要经常删除和添加节点的链表,一般都是采用双链表。


思考:如何保证p->data 没有内存泄露问题, pNext-.>data 不会重复释放?



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值