怎么删除单链表的头元素结点

如何删除单链表的头元素结点?
下面有两种方法,应该选哪个?
1.node *p;p = head;head = head->next;free(p);
2.node *p;p = head->next;head ->next = p ->next; free(p);
我发现在程序员面试宝典中,给出的是第二种方法,也就是头结点head数据域是不存数据的,head ->next 其实才是第一个结点。
但是所有的书上写的插入结点,删除结点等操作单链表程序中,头结点head的数据域都是存了数据的。也就是第一个结点其实就是head。按那些方法来看,删除头元素结点应该是第一种方法。
可能说的有点不明白,希望了解的人仔细看看帮我解决下,谢谢了。

------解决方案--------------------
两种方法都是对的,得看你自己的链表怎么定义。
如果没有空的头结点,选第一种;否则选第二种。
不过我个人还是习惯写第一种链表。。
------解决方案--------------------
有没有头节点不影响连表的正确性,不过是为了方便对链表进行操作。这个做题做的多了就有经验了吧。
------解决方案--------------------
两种方法都是正确的,主要看所使用的链表结构定义
第一种是无表头结点
第二种是有表头结点
表头结点是不用来存数据的
一般第二种方法较好,采用第二种方法,在插入删除操作时不用判断是否是第一个链表结点,规范化了链表的操作
可以参考PPT(14页)http://wenku.baidu.com/view/1cccdc8fcc22bcd126ff0c23.html
------解决方案--------------------
LZ头结点跟首元结点是不同的,上面两种方法都是正确的,如果是有头结点的就采用方法2,无头结点的采用方法1