问题背景:
使用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