单链表的应用 就地逆置
2015-10-10 09:57
176 查看
【问题描述】试实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1,a2,a3....an)逆置为(an...a3,a2,a1).
[分析]就地逆置就是不需要额外申请结点空间,只需要利用原来的表中的结点空间。若对顺序表中的元素进行逆置,可 以借助“交换”前后相应元素的方法实现,但是对于单链表就不能“交换”,时间复杂度就会达到O(n^2)。
【思想】逆置后的单链表初始化为空表,表中的结点不是新生成的,而是从原链表中依次“删除”,再逐个以头插法放置到逆置表中,如此循环,直至原链表为空表止。
[分析]就地逆置就是不需要额外申请结点空间,只需要利用原来的表中的结点空间。若对顺序表中的元素进行逆置,可 以借助“交换”前后相应元素的方法实现,但是对于单链表就不能“交换”,时间复杂度就会达到O(n^2)。
【思想】逆置后的单链表初始化为空表,表中的结点不是新生成的,而是从原链表中依次“删除”,再逐个以头插法放置到逆置表中,如此循环,直至原链表为空表止。
#include <stdio.h> #include <stdlib.h> #define ElemType char typedef struct Node /*结点类型定义*/ { ElemType data; struct Node * next; }Node, *LinkList; /* LinkList为结构指针类型*/ LinkList CreateFromTail() /*通过键盘输入表中元素值,利用尾插法建单链表,并返回该单链表头指针L*/ { LinkList L; Node *r, *s; char c; int flag =1; /*设置一个标志,初值为1,当输入"$"时,flag为0,建表结束*/ L=(Node * )malloc(sizeof(Node)); L->next=NULL; /*为头结点分配存储空间,建立空的单链表L*/ r=L; /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/ while(flag) /*循环输入表中元素值,将建立新结点s插入表尾*/ { c=getchar(); if(c!='$') { s=(Node*)malloc(sizeof(Node)); s->data=c; r->next=s; r=s; } else { flag=0; r->next=NULL; /*将最后一个结点的next链域置为空,表示链表的结束*/ } } return L; } void ReverseList(LinkList L) { Node *p,*q; p=L->next; L->next=NULL; while(p!=NULL) { q=p->next; /*q指针保留p->next得值*/ p->next=L->next; L->next=p; /*将p结点头插入到单链表L中*/ p=q; /*p指向下一个要插入的结点*/ } } int main() { LinkList l; Node *p; printf("用尾插法建立单链表,请输入链表数据,以$结束!\n"); l = CreateFromTail(); printf("输入的单链表为:\n"); p = l->next; while(p!=NULL) { printf("%c\n",p->data); p=p->next; } ReverseList(l); printf("逆置后的单链表为:\n"); p = l->next; while(p!=NULL) { printf("%c ",p->data); p=p->next; } printf("\n"); return 0; }
相关文章推荐
- Android Bitmap 全面解析
- 【译】依赖注入:代码的一针强心剂
- socket编程实现的多人局域网聊天(udp)多线程
- 深入了解iOS开发中UIWindow的相关使用
- Android Ios 异步框架
- 二分查找
- iOS开发中邮箱,电话号码,身份证,密码,昵称正则表达式验证
- Android Fragment 基本介绍
- Ajax注册表单用户名实时验证
- elasticsearch 集群
- 网页中调用JS与JS注入
- 单高斯分布模型GSM,高斯混合模型GMM
- 子空间稀疏表示
- 研究车联网的大数据更有意义
- struts配置之namespace
- notepad++好看的主题
- while 循环用法
- Java学习总结--日期
- Java 年轻代GC
- 简易部署Rsyslog和LogAnalyzer 推荐