这是悦乐书的第192次更新,第195篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206)。反转单链表。例如:

输入:1-> 2-> 3-> 4-> 5
输出:5-> 4-> 3-> 2-> 1

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

先利用递归函数,进入到最后一个节点的位置,此时需要反转指针所指向的引用方向,比如原来是n(k)-->n(k+1),现在需要反转过来变成n(k+1)-->n(k),此时需要n(k).next.next = n(k),将n(k+1)的下一个节点指向n(k),同时需要将原来n(k)节点的下一个节点指向null,即n(k).next = null。如果不指向null,会形成环,造成死循环。

public ListNode reverseList(ListNode head) {if (head == null || head.next == null) {return head;}ListNode p = reverseList(head.next);head.next.next = head;head.next = null;return p;
}

03 第二种解法

在遍历列表时,将当前节点的下一个指针更改为指向其上一个元素。由于节点没有引用其前一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。最后返回新的链表。

public ListNode reverseList2(ListNode head) {ListNode result = null;ListNode current = head;while (current != null) {ListNode pre = current.next;current.next = result;result = current;current = pre;}return result;
}

04 第三种解法

利用HashMap,依次遍历head节点,将下一个节点作为key、当前节点作为value存入其中,直到其最后一个节点。新创建一个节点指向head的最后一个节点,然后开始从map中取出key所对应的value作为新节点的下一个节点。

public ListNode reverseList3(ListNode head) {if (head == null || head.next == null) {return head;}HashMap<ListNode, ListNode> nodeMap = new HashMap<>();ListNode curr = head;int leng = 0;while (curr.next != null) {nodeMap.put(curr.next, curr);++leng;curr = curr.next;}ListNode newHead = curr;for (int i = 0; i < leng; i++) {curr.next = nodeMap.get(curr);curr = curr.next;}curr.next = null;return newHead;
}

05 第四种解法

使用栈,借助其先进后出的特点,先将head的每一个节点入栈,然后新建一个节点res,每次出栈的节点,获取其节点值val,然后创建新的节点作为res的下一个节点。

public ListNode reverseList4(ListNode head) {if (head == null || head.next == null) {return head;}Stack<ListNode> stack = new Stack<>();while (head != null) {stack.push(head);head = head.next;}ListNode res = new ListNode(-1);ListNode temp = res;while (!stack.isEmpty()) {temp.next = new ListNode(stack.pop().val);temp = temp.next;}return res.next;
}

06 第五种解法

此解法与第四种解法思路类似,只不过是将栈换成了数组,然后新建node节点,以数组最后一位元素作为节点值,然后开始循环处理每个新的节点。

public ListNode reverseList5(ListNode head) {if (head == null || head.next == null) {return head;}ArrayList<Integer> list = new ArrayList<Integer>();while (head != null) {list.add(head.val);head = head.next;}ListNode node = new ListNode(list.get(list.size()-1));ListNode last = node;for (int i=list.size()-2; i >= 0; i--) {ListNode temp = new ListNode(list.get(i));last.next = temp;last = last.next;}return node;
}

07 小结

算法专题目前已连续日更超过一个月,算法题文章51+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

转载于:https://www.cnblogs.com/xiaochuan94/p/10068914.html

LeetCode算法题-Reverse Linked List(Java实现)相关推荐

  1. LeetCode算法题-Nth Digit(Java实现)

    这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...

  2. LeetCode算法题-Design LinkedList(Java实现)

    这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...

  3. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  4. LeetCode算法题-Detect Capital(Java实现)

    这是悦乐书的第251次更新,第264篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第118题(顺位题号是520).给定一个单词,你需要判断其中大写字母的使用是否正确.当下 ...

  5. leetcode算法题--Reverse Words in a String

    原题链接:https://leetcode.com/problems/reverse-words-in-a-string/ class Solution {public:string reverseW ...

  6. LeetCode算法题-Valid Palindrome II(Java实现)

    这是悦乐书的第287次更新,第304篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第155题(顺位题号是680).给定非空字符串s,最多可以删除一个字符. 判断它是否是回 ...

  7. LeetCode算法题-Convert a Number to Hexadecimal(Java实现)

    这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...

  8. LeetCode算法题-Minimum Depth of Binary Tree(Java实现)

    这是悦乐书的第168次更新,第170篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第27题(顺位题号是111).给定二叉树,找到它的最小深度.最小深度是沿从根节点到最近的 ...

  9. LeetCode算法题-K-diff Pairs in an Array(Java实现)

    这是悦乐书的第254次更新,第267篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第121题(顺位题号是532).给定一个整数数组和一个整数k,您需要找到数组中唯一的k- ...

最新文章

  1. 大数据教程(13.6)sqoop使用教程
  2. 20151026c#2
  3. LeetCode 二叉树、N叉树的最大深度与最小深度(递归解)
  4. 远程mysql定时删除数据_mysql定时备份数据库 删除历史文件 将备份数据库传送到另外服务器...
  5. 【PyTorch】contiguous==>保证Tensor是连续的,通常transpose、permute 操作后执行 view需要此方法
  6. 推荐一条高效的Python爬虫学习路径!
  7. UE4学习-阶段性总结1
  8. 转:vSphere 7简介:混合云的功能和技术
  9. 腾讯再开源三项技术,提升企业开发及运营效率
  10. 决策控制方法:sequential 规划、behavior-aware规划、端到端规划
  11. 乐优商城项目实战系列2
  12. adc0808模数转换实验报告_adc0808模数转换电路图及程序
  13. Overfeat模型(滑动窗口)
  14. python re sub用法_python re模块常见使用方法整理
  15. html表格纵向变横向,html表格,表头竖向固定,横向滚动的例子
  16. 数据结构知识点全面总结—精华版
  17. 手机、浏览器的分辨率、状态栏参数
  18. 1405:三元一次方程
  19. 不吹不黑,网络安全工程师年薪30万是真的吗?
  20. 西部数据硬盘第一次启动很慢

热门文章

  1. hbase设计方案1
  2. (详细)JAVA使用JDBC连接MySQL数据库(1)- 软件
  3. 部署 instance 到 VXLAN - 每天5分钟玩转 OpenStack(112)
  4. JavaScript中的数组操作
  5. jax-rs的客户端完整实例
  6. NHibernate初学者指南(1):开篇
  7. 联想lenovo Z470笔记本的驱动安装
  8. VMware调试.【转】VMware+Windgb+Win7 内核驱动调试
  9. java.lang.VerifyError
  10. Oracle(order by)