笔记:单链表的倒置

问题背景:

使用Shaffer编写的教材《数据结构与算法分析》的LList类,给LList类的实现添加一个成员函数,倒置线性表中元素的顺序。对于n个元素的线性表,算法的运行时间应该为Θ(n)

 

预备知识:

表头结点:表中的第一个结点,数据域不存储任何信息,指针域存储指向第一个结点的指针。不被当做表中的实际元素。

 

正文:

 

教材中的LList类有表头结点,不再需要考虑空链表或当前位置在链表末尾这些特殊情况,所以表头结点节省了源代码。这种方法节省的空间远远大于表头结点所需要的那部分,节省空间的大小依赖于新建表的数目。

倒置图示:

第一步:

第二步:

第三步:

……

倒数第二步:

最后一步:

 

代码:

void LList::reverse()//倒置链表元素 
{
	if(head->next==NULL) return;//链表中无元素结点
	Link<E>* temp1=head->next;//保存第一个元素结点的位置 
	Link<E>* temp2=temp1->next;//保存第二个元素结点的位置
	head->next=NULL;//令头结点与第一个元素结点断开
	temp1->next=NULL;//令第一个元素结点的指针域指向NULL
        /*if(curr->next==NULL) curr=head;
        else curr=curr->next;*///处理curr指针
	while(temp2) //temp2!=NULL
	{
		Link<E>* temp3=temp2->next;//保存下一个结点的位置 
		temp2->next=temp1;//倒置两个结点 
		temp1=temp2;
		temp2=temp3;
	} 
	head->next=temp1;//将头结点的指针域指向最后一个元素结点
	return; //至此,链表中的元素已完成倒置 
}

细节详见代码注释。

 

参考文献:

【1】Clifford A.Shaffer.数据结构与算法分析【M】.北京:电子工业出版社,2013:67.

【2】杨晓波.第二次课后作业(线性表)【EB/OL】.https://mooc1-2.chaoxing.com/work/doHomeWorkNew?courseId=201712353&classId=4427178&workId=2707127&workAnswerId=0&isdisplaytable=2&mooc=1&enc=11efed278618e53387e7b933ccb03453&standardEnc=74dc029a8346c413dc327e3bf3b5d3fa,2018-10-12.

 

PS:若所给链表无头结点,可参考https://blog.csdn.net/q1239678315/article/details/52672565

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值