单链表有头节点与无头结点的区别

1.先区分一下概念:
头结点:
在单链表第一个元素结点之前设置的一个结点, 数据域可以不存任何信息,指针域指向单链表第一个元素的结点。对于单链表来说, 头结点可有可无,但为了操作方便,一般情况下单链表都具有头结点,后面的分析将会区别一下有头结点和没有头结点的区别。
优点:
减少了单链表添加删除时特殊情况的判断,减少了程序的复杂性,主要是添加和删除在第一个有元素的结点(首元结点)上有区别,如果链表没有头结点,则删除或添加时都得需要判断一次首元结点,有了头结点以后,首元结点实际为链表的第二个结点,使得所有的元素结点的添加删除更具有统一性,举例如下:

  以删除结点举例:

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. typedef struct stu  
  2. {  
  3.     int num;  
  4.     struct stu *next;  
  5. }TYPE;  

没有头结点的情况

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. TYPE * delete(TYPE * head,int num)  
  2. {  
  3.     TYPE *pf,*pb;  
  4.   
  5.     if(head==NULL)  
  6.     {   
  7.         printf("\nempty list!\n");  
  8.         return NULL;  
  9.     }  
  10.     pb=head;  
  11.     while ((pb->num!=num) && (pb->next!=NULL))  
  12.     {  
  13.         pf=pb;  
  14.         pb=pb->next;  
  15.     }   
  16.     if(pb->num==num)  
  17.     {   
  18. <span style="color:#ff0000;">       /* 注意此处需要对头指针进行特殊处理 */  
  19.         if(pb==head)  
  20.         {  
  21.             head=pb->next;  
  22.         }</span>  
  23.         else  
  24.         {  
  25.             pf->next=pb->next;  
  26.         }  
  27.         free(pb);  
  28.         printf("The node is deleted\n");   
  29.     }  
  30.     else  
  31.     {  
  32.         printf("The node not been found!\n");  
  33.     }  
  34.       
  35.     return head;  
  36. }  

有头结点的情况

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. TYPE * delete(TYPE * head,int num)  
  2. {  
  3.     TYPE *pf,*pb;  
  4.   
  5.     if(head->next==NULL)  
  6.     {   
  7.         printf("\nempty list!\n");  
  8.         return NULL;  
  9.     }  
  10.     pf = head;  
  11.     pb=head->next;  
  12.     while (pb->num!=num && pb->next!=NULL)  
  13.     {  
  14.         pf=pb;  
  15.         pb=pb->next;  
  16.     }   
  17.     if(pb->num==num)  
  18.     {   
  19.         pf->next=pb->next;  
  20.         free(pb);  
  21.         printf("The node is deleted\n");   
  22.     }  
  23.     else  
  24.     {  
  25.         printf("The node not been found!\n");  
  26.     }  
  27.   
  28.     return head;  
  29. }  
经以上删除结点代码看出,当没有头结点时,每次删除时都得去做下特殊判断,而删除带有头结点的链表时,删除的处理上更具有统一性,这也体现了链表有头结点的优点。

头指针:
   指向单链表的第一个结点的指针, 如果单链表有头结点,则头指针指向头结点 ,如果单链表没有头结点,则头指针指向第一个首元结点。
首元结点:
单链表中第一个有数据元素的结点。如果单链表有头结点,则首元结点为头结点的下一个结点,如果单链表没有头结点,则首元结点就是单链表的第一个结点。
三个概念的图模型如下:
1.有头结点




无头结点



  • 42
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值