这道题也是体验到了面向答案编程的过程,根据测试时系统反馈的错误点,不断更进完善,缝缝补补最后得到通过审核的代码
本题要求实现一个函数,将给定的单链表逆转。
正确答案:
List Reverse(List L)
{
PtrToNode ptr = L;
int len = 0;
PtrToNode temp=NULL;
while (ptr!= NULL)
{
len++; //遍历链表计算长度;
ptr = ptr->Next;
}
if(len==0)
{
return NULL; //空表直接返回NULL;
}
else
{
PtrToNode p=L;
PtrToNode q=L->Next; //在代码中不断写p->Next->Next显得代码好low,于是果断用q简化;
for (int i =0; i<len-1; i++)
{
temp=q->Next;
q->Next=p;
p=q;
q=temp;
}
L->Next = NULL; //要记得将第一个节点(也就是逆转后的最后一个节点)的指针域置空;
return p;
}
}
在这过程中我写出了好几个版本的错误代码,以下是其中一个版本,读者们动动脑看能否看出来:
List Reverse(List L)
{
PtrToNode ptr = L;
int len = 0;
PtrToNode temp=NULL;
while (ptr!= NULL)
{
len++;
ptr = ptr->Next;
}
if(len==0)
{
return NULL;
}
else
{
PtrToNode p=L;
PtrToNode q=L->Next;
for (int i =0; i<len-1; i++)
{
temp=q->Next;
q->Next=p;
p=q;
q=temp;
}
L->Next = NULL;
return L;
}
}
这个代码不运行,光靠理论下来好像和上面区别不大,但用题给数据一运行,答案使你眼前一亮,我这脑子便如豆腐脑一样(一团浆糊),经过我的又一次理论分析一点毛病没有,于是又荒废了一个下午(头发都掉光了-呜呜呜);于是我便开始分析运行的正确答案,终于,原来传回去的不再是L,而是逆转后的头节点地址;
题上没给其它两个函数的具体代码,但凭借英文单词大概猜一下:
List Read(); //读取一个链表给L;
void Print( List L ); //从新的头节点开始遍历整个链表;将题给信息分析明确很重要,不然就直接开始我们的面向结果编程吧!
又是忙忙碌碌,掉发的一天!读者有问题可以直接提出来,我们可以交流学习,共同进步;
也有可能你提的问题太高深,我也不会,望大佬见谅;
标签:单链,List,PtrToNode,PTA,Next,len,6.1,NULL,ptr From: https://blog.csdn.net/2403_82588765/article/details/142034891