1.内容:用单链表作为存储结构,实现将线性表就地逆置的操作,所谓“就地”,指辅助空间应为O(1)。
2.算法分析
本题需要利用链表作为存储结构实现线性表的就地逆置,可以使用交换数据的方式来达到数据的逆置,但是由于是单链表,数据的存取不是随机的,因此算法效率太低,可以利用指针改指来达到表逆置的目的,当链表为空表或只有一个结点时,该链表的逆置链表与原表相同;当链表包含两个以上结点时,可将该链表处理成只含有第一个结点的带头结点链表和一个无头结点的包含该链表剩余结点的链表,然后,将该无头结点链表中的所有结点顺着链表指针,由前往后将每个结点依次从无头结点链表中摘下,作为第一个结点插入到带头结点链表中,这样就可以得到逆置的链表。
3.概要分析
使用C语言,其中设置了以下函数
程序设计流程图如下:
运行结果如图所示
附上源代码:
typedef struct Lnode {
int data;//结点的数据域
struct Lnode *next;//结点的指针域
} Lnode,*LinkList;//Linklist为结构指针类型
//单链表的初始化
void InitList(LinkList &L) {
L=(LinkList)malloc(sizeof(Lnode));
L->next=NULL;
}
//建立单链表
void CreatLinkList(LinkList &L,int n) {
LinkList p,r;
r=(LinkList)malloc(sizeof(Lnode));
r=L;
for(int i=0; i<n; i++) {
p=(LinkList)malloc(sizeof(Lnode));
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
}
void PrintLinkList(LinkList &L) {
LinkList p;
for(p=L->next; p!=NULL; p=p->next) {
printf("%d ",p->data);
}
printf("\n");
}
//单链表的逆置
void ReverseList(LinkList &L) {
LinkList p,q;
p=L->next;
L->next=NULL;
while(p!=NULL) {
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
int main() {
LinkList L;
InitList(L);
printf("单链表初始化成功\n");
CreatLinkList(L,5);//假设单链表长度为5
ReverseList(L);
PrintLinkList(L);
return 0;
}