穷究链表(八)
这一篇来实现反转链表,反转链表应该算是链表操作中比较麻烦一些的操作,也是面试中常常会被问到的。可以用递归和非递归的方式来进行解决,这里我们先使用非递归的方式,然后使用递归来做。
分析:
只有超过1个链表节点的链表才需要进行反转。
一般的反转方案,需要3个辅助指针来进行实现,因为链表本身只有后向指针,没有前向指针,所以必须要保存前面的那个节点指针,以及本身的指针,以及后面一个节点的指针,因为当反转的时候,原本指向后面节点的后向指针会指向前面的一个节点,此时如果没有保存后面节点的位置,那就没有办法得到任何指向它的指针了,所以需要。
那反转到什么时候结束?
当运行到最后一个节点的时候结束。
所以得到下面的程序:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
在修改之后,其实我们细细思考,发现这样还是不好,我们最好就是也把header也改掉。为什么?理由是和前面mergelist一样的。
修改为:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
刚刚是使用循环来实现链表的反转的,现在来看是否使用递归也可以实现反转。
答案当然是肯定的。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
用递归来实现的时候,只要想通了递归式,就是简单的;但是如何得到递归式,也是一个难题。
这里在实现的时候,使用了两种参数和返回值的形式,到底哪种比较好呢,可以想一想看。