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