单链表反转的两种实现(Java)
来源:互联网 发布:淘宝客做推广有用吗 编辑:程序博客网 时间:2024/06/08 19:13
- 递归法
- 遍历法
- LinkedList的反转
递归法
经历了很多面试,面试官最爱考察的算法无非是斐波那契数列和单链表反转,尽管是这些都是基础知识,然而我对单链表反转有更多的想法。
递归法是我早期最爱在面试中使用的算法,很有逼格,写起来非常优雅,非常好理解。
先定义链表数据结构
static class Node { Integer data; Node next;}static Node readyNode() { Node linkNode1 = new Node(); linkNode1.data = 1; Node linkNode2 = new Node(); linkNode2.data = 2; Node linkNode3 = new Node(); linkNode3.data = 3; Node linkNode4 = new Node(); linkNode4.data = 4; Node linkNode5 = new Node(); linkNode5.data = 5; Node linkNode6 = new Node(); linkNode6.data = 6; linkNode1.next = linkNode2; linkNode2.next = linkNode3; linkNode3.next = linkNode4; linkNode4.next = linkNode5; linkNode5.next = linkNode6; return linkNode1;}
如上代码所示
递归法会逐层确定该节点有没有next节点,若为空,则认定递归到最深层元素。同时将该层节点的next指向父节点,在递归栈中以此类推。
static Node reverseLinkedList(Node node) { if (node == null || node.next == null) { return node; } else { Node headNode = reverseLinkedList(node.next); node.next.next = node; node.next = null; return headNode; }}
上图展示了递归后的效果。
如果注释掉第7行,会发生如上图所示的1、2号节点闭环问题。由于1号节点的next没有置空,依旧指向2号节点,所以遍历时候肯定存在环。
遍历法
static Node reverseLinkedList(Node node) { Node previousNode = null; Node currentNode = node; Node headNode = null; while (currentNode != null) { Node nextNode = currentNode.next; if (nextNode == null) { headNode = currentNode; } currentNode.next = previousNode; previousNode = currentNode; currentNode = nextNode; } return headNode;}
LinkedList的反转
LinkedList没有提供反转链表的相关函数,以下是通过foreach实现链表反转
static LinkedList reverseLinkedList(LinkedList linkedList) { LinkedList<Object> newLinkedList = new LinkedList<>(); for (Object object : linkedList) { newLinkedList.add(0, object); } return newLinkedList;}
阅读全文
0 0
- 单链表反转的两种实现(Java)
- 链式顺序表-单链表的实现-------包括(单链表反转的两种方法)
- 单链表的反转java实现
- java 实现单链表的反转
- java 实现单链表的反转
- 单链表的反转-Java实现
- java实现单链表的反转
- 反转单链表(java实现)
- (28)单链表的两种反转方法
- 单链表反转/逆序的两种方法
- 单链表反转的两种方法
- 单链表反转/逆序的两种方法
- 单链表反转/逆序的两种方法
- 单链表反转/逆序的两种方法
- 链表反转的两种实现方法
- 链表反转的两种实现方法
- js实现字符串反转的两种方法
- 链表反转的两种实现方法
- Android Studio项目目录结构介绍
- 大数据时代开源产品。
- B-1027
- Udacity-2-4-16
- 使用一个ContentProvider操作多张表
- 单链表反转的两种实现(Java)
- Android--掌握日志工具的使用
- 名企笔试:网易游戏2016招聘笔试题(双核处理)
- python文件操作
- Kotlin基本语法
- Java中的编码问题:接收、转码、输出
- 动态网页开发知识点
- ssm ${}#{}区别
- Android UI和切图