【算法】Java单链表逆转
2016-10-06 13:25
309 查看
单链表逆转置的递归与非递归方式
Node类
先看递归求解:
有点难理解,看看debug的图基本上就能懂了。
就是在temp存储了尾节点,然后再一层层往前。这个head.next=null是必须的,因为最后一个节点时不会自己赋值的,会形成一个环。
非递归算法:
这个理解起来就比较简单啦。
Node类
public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }
先看递归求解:
public ListNode reverse1(ListNode head) { // 当为空或者本节点为末尾节点的时候 if (head == null || head.next == null) return head; ListNode temp = head.next; ListNode reversedHead = reverse1(head.next); // 获取先前的下一个节点,让该节点指向自身 temp.next = head; // 破坏以前自己指向下一个节点 head.next = null; // 层层传递给最上面的 return reversedHead; }
有点难理解,看看debug的图基本上就能懂了。
就是在temp存储了尾节点,然后再一层层往前。这个head.next=null是必须的,因为最后一个节点时不会自己赋值的,会形成一个环。
非递归算法:
public ListNode reverse(ListNode head){ ListNode p = head,q = null,front = null; while(p!=null){ q = p.next;//设置q是p结点的后继结点,即用q来保持p的后继结点 p.next = front;//逆转,即使p.next指向p结点的前驱结点 front = p;//front向后移一步 p = q;//p向后移一步 } head = front;//head指向原链表的最后一个结点,完成逆转 return head; }
这个理解起来就比较简单啦。
相关文章推荐
- 链表的逆转 -- java实现
- Java学习之数组1(1.数组的声明;2.元素为引用数据类型的数组;3.关于main方法里的String[] args;4.数组排序;5.数3退1 数组算法,(用数组模拟链表);6数组查找之二分法;7数组的拷贝)
- 【LeetCode-面试算法经典-Java实现】【021-Merge Two Sorted Lists(合并两个排好序的单链表)】
- 【LeetCode-面试算法经典-Java实现】【083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)】
- 【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】
- java链表实现约瑟夫算法
- 【LeetCode-面试算法经典-Java实现】【141-Linked List Cycle(单链表中有环)】
- 【Java】给定一个有环链表,实现算法返回环路的开头结点
- 【算法设计-单链表的逆转】单链表逆转实现
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
- 【老鸟学算法】二元查找树转变成排序的双向链表——算法思想及java实现
- 一步一步写算法(之链表逆转) (转)
- JAVA中关于链表的操作和基本算法
- 算法(第四版)学习笔记之java实现栈和队列(链表实现)
- 一步一步写算法(之链表逆转)
- 链表逆转的一个算法
- 算法:链表的逆转
- 【数据结构与算法】java链表操作
- 【LeetCode-面试算法经典-Java实现】【025-Reverse Nodes in k-Group(单链表中k个结点一组进行反转)】
- 【LeetCode-面试算法经典-Java实现】【138-Copy List with Random Pointer(拷贝有随机指针的单链表)】