赞
踩
- 题目描述:给定一个单链表,对此单链表进行就地逆置
- “就地”:是指不需要开辟新的链表空间,而是在原链表的基础上调整指针的走向
- /*
- * 算法功能:建立单链表,对单链表进行就地逆置。
- * 算法中的单链表是不带头结点的。
- * 函数说明:
- * 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;
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。