国有企业改制方式:删除节点(链表)

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/26 13:08:24
学友解释一下代码:(删除第一个节点)
free(head) ;
head = head -> next ;
1,ListNode是什么?
2,head是头指针,为什么变为了第一个节点?

觉得此代码有问题
因为free(head)以后,head->next域也不存在了
应该这样写:
ListNode* p=head;
head=head->next;
free(p);
第一行建立一个临时指针,指向head,即第一个节点
第二行把head指针后移一个节点,令head指向第二个节点
第三行删除原来的头节点,这样第二个节点就成了头节点

由于free()操作只标识该段内存可以继续分配了,但是内存值还是存在的,所以LZ的代码是可以的,但是,不安全,为什么呢?因为你不能保证在free(head)后,head=head->next前,系统不会有其他的内存分配操作正好把你释放的head的那段空间占用了,如果占用了,显然是不对的,所以安全的做法就是楼上XD的做法.

btw:在某些OS的C编译器中,比如ARM8/9等芯片上运行的nucleus,free()的实现是包括清0操作的,这个也要注意了.如果是这类系统,LZ的代码就是错误的,你无法通过已经free的head来获得他的下一个节点.

对链表需要不需要头指针的问题,是要根据实际需要的,书本上只是按规范来做,而我们通常为了某些操作的简便,是不需要头指针的.第一个节点就是数据节点,这点完全可以灵活使用,不必抠死.

ListNode是楼上XD不知道LZ的head指针是什么类型的,为了声明P只好用这个来代替,LZ可以自己换成和head一样的类型呵呵