永发信息网

求解释这一段逆置的代码

答案:1  悬赏:80  手机版
解决时间 2021-02-08 11:32
void Reverse_L(LinkList &L) //逆置
{

LinkList s,p,q;
p=L->next;
q=p->next;
s=q->next;
p->next=NULL;
while(s)
{
q->next=p;
p=q;
q=s;
if(s->next!=NULL)
s=s->next;
else
break;
}
s->next=p;
L->next=s;
p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
最佳答案
这个函数是把一个链表逆序的。链表中除了链表头以外,至少要有三个元素,否则该函数会崩溃。
void Reverse_L(LinkList &L)            //逆置
{  
LinkList s,p,q;//p,q,s分别指向链表中的一个元素,p指向连续三个元素中的第一个,q指向连续三个元素中的第二个,s指向连续三个元素中的第三个,我称它为三元组
p=L->next;//此处p指向整个链表的第一个元素
q=p->next;//此处q指向整个链表的第二个元素
s=q->next;//此处s指向整个链表的第三个元素
p->next=NULL;//此处p指向整个链表的第一个元素,逆序后,第一个元素变成链表尾,所以p的next赋值为空
while(s)//s指向三元组的第三个元素,此处判断s是否为空

q->next=p;//把第二个元素q的next指向第一个元素p,就是把三元组的前两个元素的指向关系逆过来
//以下4行代码是切换三元组的,把三元组向后移了一位
p=q;//原三元组的第二个元素作为新三元组第一个元素p
q=s;//原三元组的第三个元素作为新三元组的第二个元素q
if(s->next!=NULL) //如果原三元组的第三个元素不是链表尾  
            s=s->next;//则把原三元组之后的一个元素作为新三元组的第三个元素s
        else
            break;//如果原三元组的第三个元素是链表尾,则退出循环
}
//出了循环以后,p指向新三元组的第一个元素,q和s相等,都指向新三元组的第二个元素,由于到了链表尾,新三元组只有两个元素,没有第三个元素
s->next=p;//把链表尾s的next指向链表的倒数第二元素p
        L->next=s; //把链表头L的next指向原来的链表尾s        
        p=L->next;  //p指向新链表的第一个元素 
while(p!=NULL)
{
printf("%d  ",p->data);//循环输出逆序后的新链表
p=p->next;
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
肇庆市有没有专卖华为手机的专卖店,在哪里,
包扎花束 一根彩带长8米用去3/4米还剩()米
扬名传媒我想知道这个在什么地方
老婆娇生惯养怎么办
公民法治教育活动建议的作文
第十二师一零四团地址在哪,我要去那里办事
低位补仓后再高位减仓 减仓后的价是补仓前原
不属于汗证病机的是A.表虚不固B.营卫失和C.气
2016年哪些行业挣钱
逍遥岛·家纺地址有知道的么?有点事想过去
人生占有财富的多少,13.6%靠知识
被女生拒绝加微信了,怎么办?怎么处理?怎么
绵阳完美春天酒店地址有知道的么?有点事想过
【大专怎么考】中专护理专业自考大专怎么考?
艺家斑马(绵阳川艺学院机场店)怎么去啊,我
推荐资讯
当全球9月1日和9月2日的范围各占一半时,北京
求澳门景点移动次序
电子电路中的符号cr代表的是什么三极管
蒸腊鱼怎么做好吃
梦见与自己的偶像面对面交谈是什么意思
日文翻译 (请勿用翻译器)
虎泉旅馆地址有知道的么?有点事想过去
ibm v3700 怎么搜集日志
谁知道今天3D出什么?给个准确的号码。
北下庄村地址好找么,我有些事要过去
【英国偶像】英国偶像和英国达人秀是一个比赛
作为一名销售,假如你的客户是一家五百强公司
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?