題目描述:給定一個單鏈表,對此單鏈表進行就地逆置“就地”:是指不需要開闢新的鏈資料表空間,而是在原鏈表的基礎上調整指標的走向
/* * 演算法功能:建立單鏈表,對單鏈表進行就地逆置。 * 演算法中的單鏈表是不帶頭結點的。 * 函數說明: * 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 5typedef 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;}