输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例1:
此题目是一道经典的算法题,即反转链表。
首先应该想到的是,遍历链表,逐个更改链表节点的 next 指针。为了在更改之后不丢失原来链表(即还能够找到之前的链表),所以还需要一个临时指针 temp 。此方法也是最常用的一种。
第一,首先应该判断其 head 指针是否为空,也就是 NULL。如果是 NULL,则直接返回。
第二,创建两个指针 former 和 latter 分别指向当前头指针(head)和下一个指针(head->next)。
第四,在 while 循环中,由于我们需要更改 latter 的 next,使其指向 former ,也就是前一个结点,那么这样势必会失去原链表的位置,原链表也就变得不可获取了。为了解决这个问题,所以我们要创建一个临时指针,来提前保存 latter 的 next 指针,这样就不会因为改变了 latter 的 next 指针而失去整个链表。第七,最后看只需将现在链表的最后一个结点,也就是 head->next = NULL,接完成了链表的反转。
此方法和思路1中的方法类似,只不过双指针法是 former 和 latter 结点之间的 next 指针的变化。而解法2中的方法没有增加 temp 指针来保存原链表的位置,而是直接使用了三个已经确定的指针,其中 temp 指针直接使用了 head 指针来代替。此方法也叫 头插法。
此方法不需要在循环之后,另行指定新链表最后一个结点的 next 指针。这是因为在第一次 while 循环中,其已经被指定。
所谓头插法,只不过只用了显式的 head 指针来代替 temp(思路一),防止丢掉链表。
抽象会导致耦合(COUPLING),更多的抽象就意味着更多的耦合。
为什么你应该减少代码注释?
在大多数时候,你不应该在你的代码中写注释。