对于一道面试题的疑问
近来在看《程序员面试宝典》这本书,里面有这样的一道题目:
有一个C语言用来删除单链表的头元素的函数,请找出其中的问题并纠正。
void RemoveHead(node* head)
{
free(head)
head=head->next;
}
当然了,这题错的很明显,先把head给free了就找不到head了。
书中给的答案如下:
void RemoveHead(node *head)
{
node *p;
p=head->next;
head->next=p->next;
free(p);
}
我对此的疑问是,使p指向了head的next;那么free p不是free的是head的next么,头结点并没有删除啊,而是删除了头结点的下一个结点。不知道是不是?
[解决办法]
其实我觉得很多定义就是很有二义性的,有时候我们把一个空结点当作头结点,有时候第一个结点当作头结点,而头结点的说法又可能是说第一种,或二种或第一种的后一个结点。
这个具体看头结点的定义是什么,所以如果是第三种情况,就没问题了。
head表示链表的头,但它并不存储数据
它的后一个结点是存储数据的第一个结点
随便怎么看了。