单链表的逆转

Posted nmblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表的逆转相关的知识,希望对你有一定的参考价值。

  这次做的是单链表的逆转,采用的方法比较笨,是一趟趟到头,然后逆转一个,然后再重新趟一趟,再逆转下一个,最后出了一个疏忽,就是逆转到最后一个节点(即开始被逆转链表的第一个节点)的时候,最后一个节点的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;

以上是关于单链表的逆转的主要内容,如果未能解决你的问题,请参考以下文章

单链表的逆转

单链表的逆转(测试数据)

单链表逆转

单链表逆转问题

数据结构--单链表

单链表的逆置使用递归算法出现-842150451这个值,请求高手予以解决。。