单链表逆置

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;
}

 

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值