数据实验7倒置无头节点单链表

本文提供两种实现单链表就地逆置的方法:一种通过返回新的头指针完成逆置,另一种直接修改原链表的头指针。同时给出了测试代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设线性表(a1,a2,a3,…an)采用不带头结点的单链表存储,请设计算法函数linklist reverse1(linklist  head)和
void reverse2(linklist *head)将不带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
[cpp]  view plain  copy
  1. #include "slnklist.h"  
  2. /*请将本函数补充完整,并进行测试*/  
  3. linklist reverse1(linklist head)  
  4. {  
  5.     linklist newH,q,p;  
  6.     p=head;  
  7.     newH=NULL;  
  8.     while(p!=NULL){         //  两次头插法,便改变一次顺序;  
  9.         q=p; p=p->next;  
  10.         q->next=newH;  
  11.         newH=q;  
  12.     }  
  13.     return newH;  
  14. }  
  15. void reverse2(linklist *head)  
  16. {  
  17.     linklist p=NULL,q=*head;  
  18.     while(q!=NULL){  
  19.         *head=q->next;  //  保留下一个结点;  
  20.         q->next=p;  
  21.         p=q;  
  22.         q=*head;        //  移动到下一个结点;  
  23.     }  
  24.     *head=p;            //  指向逆置后的头结点;  
  25. }  
  26.   
  27. int main()  
  28. {   datatype x;  
  29.     linklist head;  
  30.     head=creatbystack();        /*头插入法建立单链表*/  
  31.     print(head);                /*输出原链表*/  
  32.     head= reverse1(head);       /*倒置单链表*/  
  33.     print(head);                /*输出倒置后的链表*/  
  34.     reverse2(&head);            /*倒置单链表*/  
  35.     print(head);  
  36.     delList(head);  
  37.     return 0;  
  38. }  
原文http://blog.youkuaiyun.com/wlxsq/article/details/50394243
其中涉及到的头插法,可以看http://www.cnblogs.com/zhuzhenfeng/p/4626539.html,

对p=p->next的指向还是模模糊糊:https://zhidao.baidu.com/question/46794566.html
p->next只不过是获取p这个节点的next域

只有p=p->next,这种方式才是让p指向了下一个节点

q->next=p;p->next=null;q=p;

这个里面的q指向的永远是是要在当前节点添加下一个节点的哪个节点

假设 q现在指的是1节点,执行q->next=p,就是在1节点后面添加了个节点2
p->next=null,就是把2节点的next域设置为null;
q=p 就是把2节点地址给q,现在q就是指的是2节点了;如果把它这3个语句放在个循环里面就能构造个单链表了
因为 “先申请产生一个头结点” 其实就是建立一个带头结点的 空 单链表,而一个带头结点的 空 单链表,其头结点也就是尾结点。因此,以后插入新结点(p)就简单了:
p->next = (*L)->next;
(*L)->next = p; //插入到表头 摘自L:https://zhidao.baidu.com/question/1303039018443459019.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值