题目:设有一个线性表 (a0, a1, …, an-2, an-1) 存放在单链表中。试编写一个算法将该线性表原地逆置,即利用原结点空间置换为 (an-1, an-2, …, a1, a0),并分析该算法的时间复杂度。
1.需求分析
1) 用单链表存放一个线性表 (a0, a1, …, an-2, an-1) 。
2) 将该线性表原地逆置,即利用原结点空间置换为 (an-1, an-2, …, a1, a0)。
3) 分析算法的时间复杂度。
2.概要设计
函数调用关系:
ADT:
//链表的节点定义
typedef struct LinkNode
{
DataType data;//数据域
struct LinkNode *next;//指向下一个节点的指针
}NodeType;
3.详细设计
//创建链表,用户输入节点的data域值,输入结束
NodeType *Create()
{
创建头结点head=NULL;
接收数据d,并创建头结点;
创建多个非头结点;
返回head;
}
//实现单链表的逆置(翻转)。将头节点为head的单链表逆置
NodeType* Invert(NodeType* head)
{
if (链表长度为1)
{ 没法翻转, return NULL; }
p=head
q=head->next;
while(q不到链表的结尾处)
{
r=q->next;
q->next指向p;
p=q;
q=r;
}
head->next=NULL;
head=p;
return head;
}
4.调试分析
程序的时间复杂度为O(n/2)。
5.使用说明
运行程序,按照提示即可。
注释和去注释相应的代码,即可完成响应的不同操作。一共有3处。
6.测试结果
测试组一:
建立单连表,元素类型为int,以0结束输入,不能以0开始
输入第1个节点值:3
输入第2个节点值:4
输入第3个节点值:5
输入第4个节点值:6
输入第5个节点值:7
输入第6个节点值:8
输入第7个节点值:0
创建的是:从左往右,单链表的元素为: 3 4 5 6 7 8
翻转之后:从左往右,单链表的元素为: 8 7 6 5 4 3
测试组二:
建立单连表,元素类型为int,以0结束输入,不能以0开始
输入第1个节点值:12
输入第2个节点值:34
输入第3个节点值:56
输入第4个节点值:78
输入第5个节点值:90
输入第6个节点值:0
创建的是:从左往右,单链表的元素为: 12 34 56 78 90
翻转之后:从左往右,单链表的元素为: 90 78 56 34 12
测试组三:
建立单连表,元素类型为char,以#结束输入
输入第1个节点值:q
输入第2个节点值:#
创建的是:从左往右,单链表的元素为: q
只有一个,没法翻转,至少得两个
翻转之后:从左往右,单链表的元素为:空表
测试组四:
建立单连表,元素类型为char,以#结束输入
输入第1个节点值:x
输入第2个节点值:u
输入第3个节点值:e
输入第4个节点值:h
输入第5个节点值:u
输入第6个节点值:i
输入第7个节点值:p
输入第8个节点值:i
输入第9个节点值:n
输入第10个节点值:g
输入第11个节点值:#
创建的是:从左往右,单链表的元素为: x u e h u i p i n g
翻转之后:从左往右,单链表的元素为: g n i p i u h e u x
测试组五:
建立单连表,元素类型为char,以#结束输入
输入第1个节点值:shu
输入第2个节点值:输入第3个节点值:输入第4个节点值:#
创建的是:从左往右,单链表的元素为: s h u
翻转之后:从左往右,单链表的元素为: u h s
测试组六:大量数据
翻转随机数据100000个,所用时间:16
7.附录
源程序文件清单。