程序员面试攻略题2

题目:删除单向链表的头元素的函数。请找出其中的程序漏洞并加以纠正


void RemoveHead(node *head)
{
   node	*temp=head->next;
   free(head);
   head=temp;
}




分析:在C语言里,输入参数都是以值传递的方式进入子函数的,换句话说,子函数所使用的
是输入参数的一个局部副本,对这个局部副本的修改不可能在该函数以外的地方被“看到”。
但在C语言里,变量不能以引用传递方式进入子函数,当可以采用把一个指向变量的指针作为
子函数输入参数的办法来绕开这个限制,就这道面试题来说,需要把一个指向head 指针的指针传递给
RemoveHead函数做输入参数。


//正确:
void RemoveHead(node **head)
{
	node *temp;
	if(!(*head))
	{
		temp=(*head)->next;
		free(*head);
		*head=temp;
	}
}





另附一常考类型

题目:给定一个单向链表,请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,
//并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m = 0时,链表的最后一个元素将被返回。

算法:

element *FindMToLastElement(element *head,int m)
{
	element *current,*mBehind;
	int i;
	current=head;
	for(i=0;i<m;i++)
	{
		if(current->next)
			current=current->next;
		else
			return NULL;
	}
	mBehind=head;
	while(current->next)
	{
		current=current->next;
		mBehind=mBehind->next;
	}
	return mBehind;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值