单链表的reverse

单链表的反序:将已有链表的节点的值反序

废话不多说直接上代码;下面代码提供了两个版本,sll_reverse是我自己做的时候想的笨办法,answer_reverse是我在网上看的一个版本(非常精简)。

  1 #include<stdio.h>
  2 #include <stdlib.h>
  3 #define N 5
  4 typedef struct NODE{
  5     struct NODE *link;
  6     int value;
  7 }Node;
  8 Node* sll_reverse(Node *first);
  9 int sll_insert( register Node **linkp, int new_value );
 10 void print(Node* rootp);
 11 unsigned int count(Node*linkp);
 12 struct NODE *answer_reverse( struct NODE *current ); 
 13 int main (void) 
 14 {
 15     Node  *p1 = (Node *)malloc( sizeof( Node ) );
 16     p1->link=NULL;
 17     p1->value=5;
 18     int i;
 19     int value;
 20     printf("输入想要插入的值:\n");
 21     while(scanf("%d",&value)==1)
 22         sll_insert(&p1,value);
 23     print(p1);
 24     printf("\n经过反序后,链表中的内容为:\n");
 25     //print(sll_reverse(p1)); 
 26     print(answer_reverse(p1));
 27     return 0;
 28 }
 29 unsigned int count(Node*linkp)
 30 {
 31     unsigned int num=0;
 32     Node *tmp=linkp;
 33     if(!linkp)
 34     {
 35         printf("link is NULL\n");
 36         exit(1);
 37     }
 38     while(tmp)
 39     {
 40         ++num;
 41         tmp=tmp->link;
 42     }
 43     return num;
 44 }
 45 Node* sll_reverse(Node *first)
 46 {
 47     if(first==NULL)//先判断是否是空表 
 48     return NULL; 
 49     Node *newnode=(Node*)malloc(sizeof(Node));
 50     if(newnode==NULL)
 51     return NULL;
 52     
 53     Node*tmp=first;
 54     int n=count(first);//计算已经存在的单链表中的节点数目 
 55     int *p=(int*)malloc(n*sizeof(int));//进行动态数组分配 
 56     int i=0; 
 57     while(tmp!=NULL)//将原链表中节点的数据存储到动态数组中 
 58     {
 59         p[i++]=tmp->value;
 60         tmp=tmp->link;
 61     }
 62     newnode->link=NULL;
 63     newnode->value=p[n-1];//创建链表的第一个节点,并把动态数组的最后一个值赋值 
 64     for(i=n-2;i>=0;i--)//从动态数组打的倒数第二个数据开始,一次不排序的插入到新链表中 
 65     insert(&newnode,p[i]);
 66     return newnode;
 67 }
 68 struct NODE *answer_reverse( struct NODE *current )//答案的版本 
 69 {
 70 struct NODE *previous=NULL;
 71 struct NODE *next;
 72 //for( previous = NULL; current != NULL; current = next ){
 73 //next = current->link;
 74 //current->link = previous;
 75 //previous = current;
 76 //}
 77 while(current!=NULL)
 78 {
 79     next=current->link;//next保存原链表的当前指针的下一个指针 
 80     current->link=previous;//改变当前指针的执向,也就是构建新的链表 
 81     previous=current;//把原链表的第一个节点作为新链表的最后一个节点
 82     current=next;//把next的值赋值给current,直到current==NULL 
 83 }
 84 return previous;
 85 }
 86 int insert(Node **linkp,int value)
 87 {
 88     Node *current;
 89     Node *new;
 90     while((current=*linkp)!=NULL)
 91     linkp=&current->link;
 92     new=(Node*)malloc(sizeof(struct NODE));
 93     if(new==NULL)
 94     return -1;
 95     new->value=value;
 96     new->link=current;
 97     *linkp=new;
 98     return 0;
 99 }
100 int
101 sll_insert( register Node **linkp, int new_value )
102 {
103     register Node    *current;
104     register Node    *new;
105 
106     
107     while( ( current = *linkp ) != NULL &&
108         current->value < new_value )
109         linkp = &current->link;
110 
111 
112     new = (Node *)malloc( sizeof( Node ) );
113     if( new == NULL )
114         return -1;
115     new->value = new_value;
116 
117 
118     new->link = current;
119     *linkp = new;
120     return 0;
121 }
122 void print(Node* rootp)
123 {
124     if(rootp==NULL)
125     exit(1);
126     Node*tmp=rootp;
127     while(tmp)
128     {
129         printf("value=%d\n",tmp->value);
130         tmp=tmp->link;
131     }
132 }

 

posted @ 2018-04-19 21:18  快第三个十年  阅读(388)  评论(0编辑  收藏  举报