首页 > 代码库 > 链表逆序输出 ---九度1511
链表逆序输出 ---九度1511
- 题目描述:
输入一个链表,从尾到头打印链表每个节点的值。
- 输入:
每个输入文件仅包含一组测试样例。
每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。
- 输出:
对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。
- 样例输入:
12345-1
- 样例输出:
54321
解题思路:
方法一:直接用数组存储数据,然后反向输出,不过好像通不过。为什么?
方法二:利用单向链表存储数据,在输出的时候递归输出,先输出根节点的下一个节点,再输出当前节点,类似于树的后序遍历。这种方法由于需要递归调用,运行过程中占用的空间会更大。
方法三:使用双向链表,在输出的时候可以直接从链表的尾部从后向前输出。
以上两种方法,如果采用正常的创建链表和输出链表的方法,会导致运行时间过长。此时,用到的小技巧是,每次传入到链表中的不是根节点的地址,而是链表尾部的非空节点的地址,这样插入的时间复杂度就是O(1)了,不需要每次多从头到尾查找插入位置。输出的时间复杂度就是O(n)。这样,两种方法都能通过,但是方法三所用的空间更少一些。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define N 100 5 6 void printArrayList(); 7 8 /*单向链表节点*/ 9 struct Node{ 10 int value; 11 Node* next; 12 }; 13 14 /*双向链表节点*/ 15 struct BiNode{ 16 int value; 17 BiNode* next; 18 BiNode* previous; 19 }; 20 21 /* 逆序输出双向链表 */ 22 void rPrintBiList(BiNode* root){ 23 if(root == NULL){ 24 return; 25 } 26 BiNode* tmp; 27 BiNode* parent; 28 tmp = root; 29 parent = root; 30 while(tmp!=NULL){ 31 parent = tmp; 32 tmp = tmp ->next; 33 } 34 35 while(parent !=NULL){ 36 printf("%d\n",parent->value); 37 parent = parent ->previous; 38 } 39 } 40 41 42 /* 逆序输出链表 */ 43 void rPrintList(Node* root){ 44 if(root ==NULL){ 45 return; 46 } 47 rPrintList(root->next); 48 printf("%d\n",root->value); 49 } 50 51 void rPrintListTail(BiNode* tail){ 52 if( tail == NULL){ 53 return ; 54 } 55 while(tail != NULL){ 56 printf("%d\n",tail->value); 57 tail = tail->previous; 58 } 59 } 60 61 62 /* 将数据插入到双向链表的尾部 */ 63 void addToBiList(BiNode** root,int value){ 64 /* 对每一个输入点建立一个链表 */ 65 BiNode* proot = new BiNode(); 66 proot -> value =http://www.mamicode.com/ value; 67 proot -> next = NULL; 68 BiNode* tmp; 69 BiNode* parent; 70 if(*root ==NULL){ 71 *root = proot; 72 proot ->previous = NULL; 73 }else{ 74 tmp = *root; 75 parent = *root; 76 while(tmp !=NULL){ 77 parent = tmp; 78 tmp = tmp ->next; 79 } 80 parent ->next= proot; 81 proot ->previous = parent; 82 } 83 } 84 85 /* 直接插入链表的尾部 */ 86 void addToBiListTail(BiNode** tail,int value){ 87 BiNode* proot = new BiNode(); 88 proot -> value =http://www.mamicode.com/ value; 89 proot -> next = NULL; 90 if(*tail==NULL){ 91 *tail = proot; 92 proot ->previous = NULL; 93 }else{ 94 (*tail)->next= proot; 95 proot ->previous= *tail; 96 *tail = proot; 97 } 98 } 99 100 101 void addToListTail(Node** tail,int value){ // 此时必须使用Node** 作为参数,因为我们不仅需要tail所只想的内容发生改变,它自身的值也发生改变,所以需要使用指针的指针作为参数。!!!102 /* 对每一个输入点建立一个链表 */103 Node* proot = new Node();104 proot -> value =http://www.mamicode.com/ value;105 proot -> next = NULL;106 if(*tail==NULL){107 *tail = proot;108 }else{109 (*tail) ->next= proot;110 *tail = proot;111 }112 }113 /* 把数据插入到链表的尾部 */114 void addToList(Node** root,int value){115 116 /* 对每一个输入点建立一个链表 */117 Node* proot = new Node();118 proot -> value =http://www.mamicode.com/ value;119 proot -> next = NULL;120 Node* tmp;121 Node* parent;122 123 /* 将新的节点插入到链表中去*/124 if(*root == NULL){125 *root = proot; 126 }else{127 tmp = *root;128 parent = *root; //最后一个不为NULL的节点129 while(tmp!=NULL){130 parent = tmp;131 tmp = tmp->next;132 }133 parent->next = proot;134 }135 136 }137 138 /* 使用数组来存放数据 */139 void printArrayList(){140 int* intArray = (int *)malloc(sizeof(int)*N);141 int* tmp;142 int len = N;143 int input;144 int count=0;145 scanf("%d",&input);146 while(input!=(-1)){147 if(input<0){148 break;149 }150 if(count == len){151 len += N;152 tmp = (int *)realloc(intArray,len);153 intArray = tmp;154 }155 intArray[count++] = input;156 scanf("%d",&input);157 }158 for(int i = count-1; i>=0 ; i--){159 printf("%d\n",intArray[i]);160 }161 }162 163 int main(){164 165 /*printArrayList();*/166 int n;167 Node* root=NULL;168 Node* nodetail=NULL;169 BiNode* biroot = NULL;170 BiNode* tail = NULL;171 bool isFirst = true;172 scanf("%d",&n);173 while(n!=(-1)){174 /*addToList(&root,n);*/175 addToListTail(&nodetail,n);176 if(isFirst){177 root = &(*nodetail);178 isFirst = false;179 }180 /* addToBiList(&biroot,n);*/181 /* addToBiListTail(&tail,n);*/182 scanf("%d",&n);183 }184 /*rPrintList(root);*/185 rPrintList(root);186 /*rPrintBiList(biroot);*/187 /*rPrintListTail(tail);*/188 return 0;189 }190 191 192 193 /**************************************************************194 Problem: 1511195 User: jingxmu196 Language: C++197 Result: Accepted198 Time:90 ms199 Memory:5544 kb200 ****************************************************************/
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。