![7ef46fb8608424a844bbf4e943d3903f.png](https://i-blog.csdnimg.cn/blog_migrate/1cc2de770096b644a77532b99599b305.jpeg)
背景
当初大二学习数据结构的时候,有许多数据结构我都学得有点懵,总感觉没有一个系统的概括和总结,导致我的链表学得一般。后来班上有个同学微信跟我说叫我关注”程序员小灰”这个公众号,说他讲得很生动形象,最后关注了一波,看了他里面一道经典的面试题——链表反转。接下来就来讲解链表反转的解法。
链表反转图示
![447698d867bba10c9184afbc682fc231.png](https://i-blog.csdnimg.cn/blog_migrate/c1a69d76ae37e5bec4b729ee5437d990.jpeg)
解法说明
- 链表反转的本质其实就是把每一个节点原本指向下一个节点的next的指针,反转过来指向它的前置节点。
![bacaacb52a3c5fdbd6ff7161bf2ed946.png](https://i-blog.csdnimg.cn/blog_migrate/a32784e3c72fee378e8c100a3a46fee2.png)
- 进行链表反转的时候,需要同时知道三个节点才能进行反转。
![f0577e482e3df62f13584092603ceda0.png](https://i-blog.csdnimg.cn/blog_migrate/dc2fc0c5ecd6945475bbe47c3a8ff24a.jpeg)
解法步骤
1、以p2节点为根,把p2节点原本指向p3的next指针反转,指向p1
![6e2031f7d279c997c464308936c451cc.png](https://i-blog.csdnimg.cn/blog_migrate/b49888ac06fb9b2bda5000ce3f53aec7.png)
2、三个临时节点引用p1,p2,p3分别向后移动一位
![c3240dfbd31245e0347217f65f396b25.png](https://i-blog.csdnimg.cn/blog_migrate/f474bbd846bf7a5c550d00545216985d.png)
3、重复”1”的工作,以p2节点为根,把p2节点原本指向p3的next指针反转,指向p1
![30c21df7b34ac308a715174577e2ae6f.png](https://i-blog.csdnimg.cn/blog_migrate/a592d5ddf96a3d7afb71b51c503e02c6.png)
4、重复”2”的工作,三个临时节点引用p1,p2,p3分别向后移动一位
![dab7685e681722500436a5d25c1ea85d.png](https://i-blog.csdnimg.cn/blog_migrate/485808b7223f1160bd16e653e58fe268.png)
5、继续重复以上的工作,一直到p2为空为止
![a5dbb45cbd74eb02920faea6834d6a18.png](https://i-blog.csdnimg.cn/blog_migrate/990193fdfd93df07d82002dd7a875dd1.png)
6、最后,把head节点的next指向空,成为反转链表的尾节点。并把p1赋值给head,让p1所在节点成为反转链表的头节点
![e8e4cdda394ab87bd0f20e95688573fc.png](https://i-blog.csdnimg.cn/blog_migrate/ee2906cbc380f093e1a147821ba8b83c.png)
听完上面的讲解,估计有点懵逼,来看看代码的实现,再结合上面的图示步骤,相信你就会理解链表反转了
代码实现
public
总结
对于链表的反转就介绍到这里,感谢大家的支持。嘻嘻嘻~~~
参考来源
- 程序员小灰公众号
- 牛客网原题链接