题目描述:给定一个单链表,对此单链表进行就地逆置
“就地”:是指不需要开辟新的链表空间,而是在原链表的基础上调整指针的走向
/*
* 算法功能:建立单链表,对单链表进行就地逆置。
* 算法中的单链表是不带头结点的。
* 函数说明:
* 1.TransLinklist(Linklist &L):递归地对单链表进行逆置
* 2.TranLinkNoneRecur(Linklist &L) :循环地对单链表的每个节点进行逆置
* @author:xiaoq-ohmygirl
* @time :2012-06-20
**/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAXNODE 5
typedef struct linkNode{
int data;
linkNode * next;
}linkNode,*linkList;
int createLinkList(linkList & L,int n){
L = (linkList)malloc(sizeof(linkNode));
if(!L){
return 0;
}
scanf("%d",&L->data);
L->next = NULL;
linkList p;
for(int i = n-1;i > 0;i--){
p = (linkList)malloc(sizeof(linkNode));
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
return 1;
}
linkList reverseLinklist(linkList &L){
if( L == NULL || L->next == NULL){
return L;
}
linkList node = reverseLinklist(L->next);
L->next->next = L;
L->next = NULL;
return node;
}
linkList reverseLinkNoneRecur(linkList L){
if(L == NULL){
return L;
}
linkList pre = NULL,cur = L,p = NULL;
while(cur->next != NULL){
p = cur->next;
cur->next = pre;
pre = cur;
cur = p;
}
cur->next = pre;
return cur;
}
void visit(linkNode * node){
printf("%d->",node->data);
}
void getNewLine(){
printf("\n");
}
//不带头结点的单链表
void traverseLink(linkList L){
linkNode* cur = L;
getNewLine();
while(cur != NULL){
visit(cur);
cur = cur->next;
}
getNewLine();
}
main(){
linkList La = NULL,Lb = NULL,Lc = NULL;
createLinkList(La,MAXNODE);
printf("1: ");
traverseLink(La);
Lb = reverseLinklist(La);
printf("2: ");
traverseLink(Lb);
Lc = reverseLinkNoneRecur(Lb);
printf("3: ");
traverseLink(Lc);
system("pause");
return 0;
}