链表这个数据结果经常遇见,这里提供一个链表反转的java代码实现,有三种算法,一种是递归的,俩种是非递归的。
首先为了方便测试,在博文最后贴上递归实现链表创建的代码,以供读者快速上手测试,提供的代码可以复制以后直接测试
先看看Node节点把
1 | 复制代码public class Node { |
看看链表反转递归方法
1 | 复制代码public Node reverserLinkedList(Node node){ |
- 递归的实现总是这么的简单,代码简练就是递归的好处,而且逻辑易于处理,只要能够出找出一层的逻辑,然后找出特殊值和出口,一个递归就已经完成啦
- 这里出口显然就是那个if,为的是找到最后一个节点,然后就可以开始往前递归反转,同时这个if可以排除参数只有一个节点,参数为null的情况。
- 递归的栈累计到最高层的时候(递归本质是栈,每一次递归放入一个栈,如果这层运行结束,就会弹出,运行下一层),最后一个if结束以后, 开始反转, 反转的逻辑其实很简单, 吧当前节点的下一个节点指向自己,然后自己指向null
说完了递归的算法,也了解递归其实就是栈,现在就用相同的逻辑,只不过把递归变成循环,用java本身实现的Stack数据结构编写一个更加高效的代码
1 | 复制代码public Node reverserLinkedList2(Node node){ |
逻辑一目了然,备注上面的解释已经很清楚啦
还有一个循环写法更加简单,使用俩个指针,不需要栈结构
1 | 复制代码public Node reverserLinkedList3(Node node){ |
这个的思路就是 俩个指针,把一个链表分成俩个部分, newNode是已经反转部分,curNode是为反转部分,然后通过俩个指针的配合,不断的右移直到前部反转
现在贴其他代码部分啦,先贴链表构建的
1 | 复制代码public class LinkedListCreator { |
main函数
1 | 复制代码public static void main(String[] args) { |
博文是作者原本在其他平台的,现迁移过来
本文转载自: 掘金