单链表的算法经常会出现在面试过程中,一般会问到:
1. 遍历一次找到中间节点
2. 删除某个特定的几点
3. 单链表反转。
其实这些算法都不难,主要考查的是思想,单链表有一个特点就是它只有后驱节点,没有前驱节点,稍不留神,会导致找不到需要的节点。
今天会给大家介绍一下单链表反转的两种算法。具体实现代码就不贴出来了,这次只用图表来说明,用以表明算法思路。
这是原始单链表结构:
接下来以用临时三个指针,分别指向1,2,3三个节点。 (注:我们这里把HEAD作为特殊节点,不保存任何数据。有的会将 HEAD 作为第一个节点。)
把1和2之间的连接断开
2的后驱指向1
P1指向P2(2),P2指向P3(3),P3指向 P3->next(4),结果如下图:
重复以上操作,到下图结束:
由于P3->next 是NULL, 表示链表结束。这时,将P3->next 指向 P2,单链表反转的主体功能就已经结束。这时需要把 HEAD->next->next 指向NULL。
但是在遍历单链表时,从 HEAD 开始,下一个节点是1,再下一个节点就是 NULL, 剩余的节点没有被遍历到,我们看到,节点1的前驱有两个,一个是 HEAD, 另外一个是节点2.
下一步我们需要做的是将 HEAD 和节点1的连接断开,将 HEAD 的 NEXT 指向 P3.
这时 P1,P2, P3 的任务完成,最终的结果如下:
这里我们是将 HEAD 看作一个特殊的节点。如果HEAD看作第一个节点,我们的做法和这个大同小异。
下一篇文章会结束反转单链表的另外一种算法。