C语言之从尾到头打印链表

来源:互联网 发布:阿里移动推荐算法代码 编辑:程序博客网 时间:2024/06/03 16:01
从尾到头打印链表:看完这题以后,很多人的第一反应就是从头到尾输出比较简单,于是我们很自然地想到把链表中链接结点的指针反转过来,改变链表的方向,就可以从头到尾输出了。但是该方法会改变原来链表的结构。那如果我们不该表链表的结构又怎样打印呢。#include <stdio.h>#include <stdlib.h>typedef struct _list{struct _list *next;int data;}List;typedef struct _stack{int data[10];int top;}Stack;int InitStack(Stack *s){if(s == NULL){return 0;}s->top = -1;return 1;}int Insert_list(List *list, int data){if(list == NULL){return 0;}List *node = (List *)malloc(sizeof(List)/sizeof(char));if(node == NULL){return 0;}node->data = data;node->next = list->next;list->next = node;return 1;}int Display(Stack *s, List *list)   //栈打印链表元素{if(s == NULL || list == NULL){return 0;}List *tmp = list->next;while(tmp){s->data[++s->top] = tmp->data;tmp = tmp->next;}while(s->top != -1){printf("%4d",s->data[s->top--]);}printf("\n");return 1;}void r_display(List *list)              //递归打印链表元素{if(list->next == NULL){return ;}r_display(list->next);printf("%4d",list->next->data);}int main(){Stack *s = (Stack *)malloc(sizeof(Stack)/sizeof(char));if(s == NULL){return 0;}InitStack(s);//置空栈List *list = (List *)malloc(sizeof(List)/sizeof(char));if(list == NULL){return 0;}list->next = NULL;Insert_list(list,1);//链表头插法Insert_list(list,2);Insert_list(list,3);Insert_list(list,4);Insert_list(list,5);Insert_list(list,6);Insert_list(list,7);r_display(list);printf("\n");//Display(s,list);return 0;}总结:很多人看完题目以后会想到一遍又一遍地遍历找最后一个节点,然后打印节点里的值,但是你们有没有想过这样的打印,它的时间复杂度又该增加了多少,所以我们不用这种方法。我们很容易想到,我们的栈这种数据类型就是先进后出,和我们题目中的要求不谋而合,所以我们就用栈的方式去打印链表,这样我们也不用花很多的系统资源去一遍又一遍地去遍历链表。同时我也提供了一种更简单的方式打印链表,那就是递归,这样可以使你的代码变得很简洁,但是使用递归就和我前面说的时间复杂度增大。