经典面试题--单链表之无头删除


在删除一个单链表的一个数据成员时,大家都应该很清楚得有个头,就说说简单的尾删吧,你的做法一定是这样子:phead位置向后一直找到尾巴的前一个位置,将他的next改为NULL,然后释放掉尾巴就ok;看似简单问题还是用到了phead,因为你至少得让可动指针指向准备删除这个成员的前一个成员身上。

   中间删,就是从头找到要删的成员之前成员身上,问题还是在phead,也许你会这么想,直接给定你位置,不久可以不用phead从头开始再挨个挨个找那个位置了呀!但是敏感的人都知道,要是问题要删除的是p后面那个元素,那么问题就很简单了吧!

  (但是问题就让你删除p)如果你直接删除p那么这个单链表就断了,你如果先不删,准备把上一个的next指过来,但是单链表没有前驱,找不到上一个成员。而且也没有phead来寻找上一个成员。那么现在我来教你一种很经典的办法!

     办法:

          你将p->data的值用p->next->data覆盖ok;一次类推将后面的都要往前覆盖,记得释放掉最后一个结构体,不然内存泄漏。

   代码:

bool destory_link_list_ex(NODE *phead)
{
	elem_type e = 0;
	int m = get_length(phead);
	if(phead == NULL)
	{
		return false;
	}
	for(int i = 0;i < m ;i ++)
	{
		delete_head(phead,&e);
	}
	free(phead);
	return true;

}

bool del_no_head(NODE  *p)
 {
     NODE *s = p->next;
	 if(p == NULL)
	 {
		 return false;
	 }
	 while(s->next  != NULL)
	 {
		 p->data = s->data;
		 p = s;
		 s = s->next;
	 } 
	 p->data = s->data;
	 p->next = NULL;
	 destory_link_list_ex(s);
	 return true;
 }
代码就是这样子,是不是很经典。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值