目录

笔记单链表的倒置

目录

笔记:单链表的倒置

问题背景:

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

预备知识:

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

正文:

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

倒置图示:

第一步:

https://i-blog.csdnimg.cn/blog_migrate/27c15fc61eca4b4d9438e6bd117e80c8.png

第二步:

https://i-blog.csdnimg.cn/blog_migrate/29707062a8e9a77030cfd28cfa94b9e5.png

第三步:

https://i-blog.csdnimg.cn/blog_migrate/9ea601b585cffafee35b39430641ab45.png

……

倒数第二步:

https://i-blog.csdnimg.cn/blog_migrate/ae79bdc1f14cc6d4ff7a1a58d5dcf965.png

最后一步:

https://i-blog.csdnimg.cn/blog_migrate/f590a3d80ad1f4da1f725d895d07699b.png

代码:

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】. ,2018-10-12.

PS:若所给链表无头结点,可参考