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