本题来自左神《程序员面试代码指南》“反转单向和双向链表”题目。

题目

分别实现反转单向链表和反转双向链表的函数。

如果链表长度为N,时间复杂度要求为O(N),额外空间复杂度要求为O(1)。

题解

本题比较简单,读者做到代码一次完成,运行不出错即可。

  • 反转单向链表的函数如下(该函数返回反转之后链表新的头节点)
  • 反转双向链表的函数如下(函数返回反转之后链表新的头节点)
package chapter_2_listproblem;public class Problem_04_ReverseList {public static class Node {public int value;public Node next;public Node(int data) {this.value = data;}}public static Node reverseList(Node head) {Node pre = null; // pre 始终指向头插法得到的新链表的表头Node next = null; // head 始终指向越来越短的原链表的表头while (head != null) {next = head.next;head.next = pre;pre = head;head = next;}return pre;}public static class DoubleNode {public int value;public DoubleNode last;public DoubleNode next;public DoubleNode(int data) {this.value = data;}}public static DoubleNode reverseList(DoubleNode head) {DoubleNode pre = null;DoubleNode next = null;while (head != null) {next = head.next;head.next = pre;head.last = next;pre = head;head = next;}return pre;}public static void printLinkedList(Node head) {System.out.print("Linked List: ");while (head != null) {System.out.print(head.value + " ");head = head.next;}System.out.println();}public static void printDoubleLinkedList(DoubleNode head) {System.out.print("Double Linked List: ");DoubleNode end = null;while (head != null) {System.out.print(head.value + " ");end = head;head = head.next;}System.out.print("| ");while (end != null) {System.out.print(end.value + " ");end = end.last;}System.out.println();}// for testpublic static void main(String[] args) {Node head1 = new Node(1);head1.next = new Node(2);head1.next.next = new Node(3);printLinkedList(head1);head1 = reverseList(head1);printLinkedList(head1);DoubleNode head2 = new DoubleNode(1);head2.next = new DoubleNode(2);head2.next.last = head2;head2.next.next = new DoubleNode(3);head2.next.next.last = head2.next;head2.next.next.next = new DoubleNode(4);head2.next.next.next.last = head2.next.next;printDoubleLinkedList(head2);printDoubleLinkedList(reverseList(head2));}}

左神算法:反转单向和双向链表(Java版)相关推荐

  1. 左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)

    本题来自左神<程序员面试代码指南>"最大值减去最小值小于或等于num的子数组的数量"题目. 题目 给定数组 arr 和整数 num,共返回有多少个子数组满足如下情况: ...

  2. 左神算法:求最大子矩阵的大小(Java版)

    本题来自左神<程序员面试代码指南>"求最大子矩阵的大小"题目. 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1 ...

  3. JAVA算法:解救小哈(JAVA版)

    JAVA算法:解救小哈(JAVA版) 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那 ...

  4. 左神算法:将搜索二叉树转换成双向链表(Java版)

    本题来自左神<程序员代码面试指南>"将搜索二叉树转换成双向链表"题目. 题目 对二叉树的节点来说,有本身的值域,有指向左孩子节点和右孩子节点的两个指针:对双向链表的节点 ...

  5. 左神算法:将单链表的每K个节点之间逆序(Java版)

    本题来自左神<程序员代码面试指南>"将单链表的每K个节点之间逆序"题目. 题目 给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K 个节点之间逆序,如果 ...

  6. 左神算法:判断 t1 树中是否有与 t2 树拓扑结构完全相同的子树(Java版)

    本题来自左神<程序员代码面试指南>"判断 t1 树中是否有与 t2 树拓扑结构完全相同的子树"题目. 题目 给定彼此独立的两棵树头节点分别为 t1 和 t2,判断 t1 ...

  7. 左神算法:调整搜索二叉树中两个错误的节点(Java版)

    本题来自左神<程序员代码面试指南>"调整搜索二叉树中两个错误的节点"题目. 题目 原问题: 一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再 ...

  8. 左神算法:二叉树的按层打印与ZigZag打印(Java版)

    本题来自左神<程序员代码面试指南>"二叉树的按层打印与ZigZag打印"题目. 题目 给定一棵二叉树的头节点 head,分别实现 按层 和 ZigZag 打印 二叉树的 ...

  9. 左神算法:未排序正数数组中累加和为给定值的最长子数组长度(Java版)

    本题来自左神<程序员代码面试指南>"未排序正数数组中累加和为给定值的最长子数组长度"题目. 题目 牛客OJ:未排序数组中累加和为给定值的最长子数组长度 题解 本文提供的 ...

最新文章

  1. 每日程序C语言39-不带头结点的头插法创建链表
  2. java数据结构与算法_清华大学出版社-图书详情-《数据结构与算法分析(Java版)》...
  3. 神州云科DCN存储管理IP_干货!DCN校园网大二层解决方案详解
  4. project日历设置-大小周交替
  5. sqlserver查看表空间
  6. thread_LockSupport
  7. typecho运行html插件,typecho主题集成HTML压缩功能
  8. 你必须知道iPad的10件事
  9. 类型字节oracle 增强型时间类型以及postgresql时间类型
  10. 代理ARP产生路由环路问题分析
  11. 天行健,君子以自强不息;地势坤,君子以厚德载物
  12. nvidia驱动程序下载类型怎么选?
  13. MySQL_简易图书数据库管理系统_峰峰博客_峰峰吃芒果
  14. 你真的会用区块链赚钱吗?论区块链的商业思维
  15. Matlab 文件重命名
  16. 常用RL算法的主要特性
  17. java7找不到uri_部署-Java Jar文件:使用资源错误:URI不是hierarchi
  18. win10 删除打开方式里的多余项
  19. 手机和PC站点击商务通无轨迹解决方法
  20. 港科夜闻|香港科大人文社会科学学院阎连科教授获得英国皇家文学学会首颁国际作家终身荣誉奖...

热门文章

  1. HDU - 4687 Boke and Tsukkomi(一般图最大匹配-带花图)
  2. HDU - 2859 Phalanx(动态规划/哈希表)
  3. mfc如何将一个数组中的字节数据用串口发送出去_[翻译] 串口通信的帧(frame)...
  4. debian重启ssh服务_Jenkins远程部署Linux服务器
  5. TensorFlow2-卷积神经网络
  6. HDU1016(DFS)
  7. 10.切片slice.rs
  8. 0.IDA-基本的反汇编算法
  9. setsockopt函数全面解析
  10. Ansible 快速入门