ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单链表的逆转

2019-06-09 15:38:18  阅读:243  来源: 互联网

标签:结点 单链 Next num L3 逆转 节点


  这次做的是单链表的逆转,采用的方法比较笨,是一趟趟到头,然后逆转一个,然后再重新趟一趟,再逆转下一个,最后出了一个疏忽,就是逆转到最后一个节点(即开始被逆转链表的第一个节点)的时候,最后一个节点的next指向的其实还是倒数第二个节点(这是未逆转时的情况,这里没有改变它),然后倒数第二个节点经过逆转后指向的节点是倒数第一个,所以这里就形成了一个闭环,当输出的时候会死循环。

     情况大致如此,给以后遇到同样问题的盆友一个借鉴,说不定会有点·帮助,最后贴上数据结构和函数代码:

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;

 


List Reverse( List L ){


// 通过一次次的遍历来做
// 需要逆转后的头结点、两个浮动结点、计数器
//判断是否为空,为空的话直接返回NULL
if(!L)
return L;

//不为空的话则进行以下操作
//初始化计数器
int num = 1;

//定义结点和浮动结点
List L1,L2,L3;

//初始化原链表的浮动结点
L3 = L;

//先找到原先的尾节点
while(L3->Next){
//如果L的下一个结点不为空,那么继续循环
L3 = L3->Next;
num++;
}


//循环结束以后,num为单链表长度
//初始化头结点和浮动结点
L1 = L3;
L2 = L3;


//此时已经逆转了一个节点,故num--
num--;

//进行循环赋值
for(;num>0;num--){
//只要num还有值长度,就继续循环
// 每次循环逆转一个节点

//重新初始化原链表浮动结点
L3 = L;
for(int i = 1;i<num;i++){
//每次循环往后移一位
L3 = L3->Next;
}

//循环结束后移到了最后的还没逆转的一位
//逆转链表拓展一位
L2->Next = L3;
L2 = L2->Next;
}

//此时最后一个节点的尾指针并未指空,而是指向的倒数第二个节点
// 而倒数第二个节点指向的是最后一个节点,当输出的时候这里会形成死循环
// 所以要把最后一个节点的下一个指针置空
L2->Next = NULL;

//循环结束,逆转完成
return L1;

}

标签:结点,单链,Next,num,L3,逆转,节点
来源: https://www.cnblogs.com/nmblog/p/10993665.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有