逆转单链表

    (没有都节点的)其中 List 跟 Position 是结构指针;

typedef struct Node {
    int value;
    struct Node *next;
} *List;
typedef List Position;


List
ReverseList( List L ) {  // Assuming no header.
	if( L == NULL )
		return L;
	Position PreviousPos, CurrentPos, NextPos;
	
	PreviousPos = NULL;
	CurrentPos = L;
	NextPos = L->next;
	while( NextPos != NULL ) {
		CurrentPos->next = PreviousPos;
		PreviousPos = CurrentPos;
		CurrentPos = NextPos;
		NextPos = NextPos->next;
	}
	CurrentPos->next = PreviousPos;
	
	return CurrentPos;
}


(有头结点的)下面中开始判断的时候不能用(L == NULL || L->next == NULL) 或( L == NULL && L->next == NULL ) 里面的判断条件必须分开写,至于为什么,仔细想想应该就清楚了。

List
ReverseList( List L ) {  // Assumed header
	if( L == NULL )
	    return L;
	if( L->next == NULL )
	    return L;
	Position PreviousPos, CurrentPos, NextPos;
	
	PreviousPos = NULL;
	CurrentPos = L->next;
	NextPos = CurrentPos->next;
	while( NextPos != NULL ) {
		CurrentPos->next = PreviousPos;
		PreviousPos = CurrentPos;
		CurrentPos = NextPos;
		NextPos = NextPos->next;
	}
	CurrentPos->next = NextPos;
	L->next = CurrentPos;
	
	return L;
}



    (下面来个递归实现的,这个递归实现的方法参考自:

    ( http://blog.163.com/lichunliang1988116@126/blog/static/26599443201282083655446/ )

     不过他的递归实现的代码是错误的。

         

单链表逆转 - 追风逐月 - 追风逐月

        p1 和p2指针分别指向当前递归子链表list1的第一个和第二结点。然后对以p2为首结点的子链表list2进行递归逆转;则p2节点将成为list2r逆转后的尾结点,而此时函数返回的头结点将是原list2的尾结点(如下图)。最后我们只要把p2的next指向p1就OK了。

单链表逆转 - 追风逐月 - 追风逐月

下面是改正后的代码

List
ReverseList( List L ) {   // Assuming no header
	if( L == NULL )
		return L;
	if( L->next == NULL )
		return L;
		
	Position p1, p2;
	
	p1 = L;
	p2 = p1->next;
	L = ReverseList( p2 );
	p2->next = p1;
	p1->next = NULL;
	
	return L;
}


你可能感兴趣的:(逆转单链表)