写在前面
好久没有写文章了,冬天来了人变得慵懒了;还有就是觉得自己写了那么的文章,一直没有什么人看,总觉得有些郁郁不得志的感觉,。可是最近看到偶尔还是有人点赞我的文章,尽然还有一个不知名的哥们给我打赏(受宠若惊),我觉得写下去还是有意义的,就像很多时候我们并不知道方向在哪里?也不知道我们做的到底是对还是错,坚持往下走走看,也许就柳暗花明又一村了。
链表翻转算法
说来不怕你笑,我也写了好多年程序了,如果没有IDE,让我在白板上写出可以正确运行的链表翻转算法我是真的写不出来的。虽然说起来很简单,把指针调换一下就OK了,实现起来并不是那么简单。说真的这还真是一个考验基本功的算法。
先来看一下我写的代码。
LinkedNode cur = head;
LinkedNode pre = null;
while (cur != null) {
LinkedNode tmp = pre;
pre = cur;
pre.next = tmp;
cur = cur.next;
}
虽然代码看起来也就三四行,但是很多时候我是特别容易搞错,因为在链表里面基本都是指针来回的指来指去,所以一定要注意移动节点的时候会造成的影响。
我来解释一下这个代码:
- 创建cur节点的目的是不让head节点移动,这样你就可以知道原来链表的头在哪。
- 创建pre节点是为了从后一个节点指向前一个节点。在我们循环cur节点的时候,什么时候把后一个节点指向前一个节点呢?
我们要明白一点,我们的pre在一次循环的时候是被移动了(简单来说第一次就是从pre从null-->1),而我们的目的是1-->null,简单来说我们操作的都是pre,这怎么能实现呢?在编程的世界里很多时候我们都会借用临时变量,因此我们需要先把为改变的pre保存起来(tmp = pre),然后就可以从新的pre指向临时变量来完成操作。
网友评论