单链表的逆转

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

}

posted @ 2019-06-09 15:34  nm_bk  阅读(298)  评论(0编辑  收藏  举报