在学习数据结构的时候,我们会使用到单链表,其拥有一个结点和一个数据的结构很是让我们方便使用,但是我们会发现但我们顺序读取和打印都很方便,但是假设我们需要逆序读取或打印的时候就会出现问题,因为我们的单链表的存储空间并非像顺序表那样是连续的存储空间,经过我的一番查找和思考我发现了以下几种单链表逆序打印的方法。
一、改变每一个链表指向下一个结点的指针指向我们上一个结点即可 这样做简单粗暴,而且算法我们可以很容易地能够理解但是运算量相当大,而且需要一个媒介来保存当前的指针,而且会破坏原有的链表结构,我们如果想要链表的结构不被破坏则需要在逆序输出或使用后再度复原原链表,耗时又耗力。
二,借用栈的模式倒叙输出我们链表,这个算法的原理我们也比较容易理解。栈的模式是先进后出,后进先出。当我们遍历链表的时候,我们会先遍历到第一个节点,将它放到栈底,当我们遍历到最后一个节点的时候,它被放到了栈的最上面。所以当我们打印的时候先取出栈顶的元素打印这边是链表的最后一个节点,依次打印便可以打印出链表的逆序。
三,使用递归 这个也是我使用的一种方法。这个方法的使用熟悉递归的人 可以很容易地理解。它给我的感觉有点类似于栈。再次不多赘述。直接贴上我的代码
void reverse(Pnode phead)//逆序打印
{
if(phead==NULL)
{
return ;
} //此处直接打印即为顺序打印
if(phead->next!=NULL){
reverse(phead);
}
printf("%d",phead->date);
}
四,使用数组来逆序打印,这也是一个比较好理解的方法。我们可以在顺序遍历链表的同时将需要的数据全部保存到一个数组中去,然后我们再将我们的数组中的数据一一对应逆序打印出来即可。虽然这样做也很易于理解。但是需要开辟新的数组来保存数据,同样也十分臃肿。
综上是我所了解到的几种方法,就我个人而言,如果数据不是很大的情况下,使用递归不乏一种简单的做法。而数组法和强行改变指针法不管在数据较小或较大时,都会存在较大的运算不方便我们进行运算。递归或许是较为方便的解法。如有问题,希望各位大佬多多包含,进行指出。