这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

LeetCode算法题-Reverse Linked List(Java实现)的更多相关文章

  1. LeetCode算法题-Reverse String(Java实现)

    这是悦乐书的第205次更新,第217篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第73题(顺位题号是344).编写一个以字符串作为输入并返回字符串的函数.例如: 输入: ...

  2. LeetCode算法题-Reverse Bits(Java实现)

    这是悦乐书的第185次更新,第187篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第44题(顺位题号是190).给定32位无符号整数,求它的反转位.例如: 输入:4326 ...

  3. LeetCode算法题-Reverse Words in a String III(Java实现)

    这是悦乐书的第259次更新,第272篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第126题(顺位题号是557).给定一个字符串,您需要反转句子中每个单词中的字符顺序,同 ...

  4. LeetCode算法题-Reverse String II(Java实现)

    这是悦乐书的第256次更新,第269篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541).给定一个字符串和一个整数k,你需要反转从字符串开头算起的 ...

  5. LeetCode算法题-Palindrome Linked List(Java实现)

    这是悦乐书的第196次更新,第202篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第58题(顺位题号是234).给出一个单链表,确定它是否是回文.例如: 输入:1-> ...

  6. LeetCode算法题-Reverse Vowels of a String(Java实现-四种解法)

    这是悦乐书的第206次更新,第218篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第74题(顺位题号是345).编写一个函数,它将一个字符串作为输入,并仅反转一个字符串的 ...

  7. LeetCode算法题-Remove Linked List Elements(Java实现)

    这是悦乐书的第189次更新,第191篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第48题(顺位题号是203).移除单链表中节点值为val的节点.例如: 输入:1-> ...

  8. LeetCode算法题-Base 7(Java实现)

    这是悦乐书的第247次更新,第260篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第114题(顺位题号是504).给定一个整数,返回其基数为7的字符串表示.例如: 输入: ...

  9. LeetCode算法题-Add Strings(Java实现)

    这是悦乐书的第223次更新,第236篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第90题(顺位题号是415).给定两个非负整数num1和num2表示为字符串,返回num ...

随机推荐

  1. Spring Boot入门(2)使用MySQL数据库

    介绍   本文将介绍如何在Spring项目中连接.处理MySQL数据库.   该项目使用Spring Data JPA和Hibernate来连接.处理MySQL数据库,当然,这仅仅是其中一种方式,你也 ...

  2. C#模拟httpwebrequest请求_向服务器模拟cookie发送

    使用C#代码模拟web请求,是一种常用的方法,以前没专门整理过,这里暂时贴上自己整理的完整代码,以后再做梳理: public class MyRequest { #region 辅助方法 public ...

  3. Chrome插件开发,美化网页上的文件列表。chrome-extension,content-scripts

    趁着2018年还剩最后几天,发几篇博客,荒废太久了,惭愧. 最近也是需求驱动,研究了下Chrome插件开发.来看一下我们公司运维提供的日志查看页面 所有项目的日志都参杂在一起,每次去找都很痛苦.慢慢发 ...

  4. 数据库部分(MySql)_2

    分组查询 分组查询通常和聚合函数结合使用,查询条件中每个XXX就以XXX为分组的条件: 格式:每个A的平均B select avg(B) from 表名 group by A; having 在whe ...

  5. asp.net-基础-20180321

    C#与.NET的关系 C#不是语言,.net是平台.

  6. 35.QT-多线程

    程序和进程的区别 进程是动态的,程序是静态的,进程是程序运行时的实例,是占用系统运行资源的程序 进程是暂时的,程序是永久的, 进程是通过程序运行时得到的 程序是一个数据文件,进程是内存中动态的运行实体 ...

  7. codeM美团编程大赛初赛B轮D题(考验你的数学思维!)

    [编程题] 模 时间限制:1秒空间限制:32768K 给定四个正整数a,b,c,k,回答是否存在一个正整数n,使得a*n在k进制表示下的各位的数值之和模b为c.输入描述:第一行一个整数T(T < ...

  8. Spring,SpringMvc配置常见的坑,注解的使用注意事项,applicationContext.xml和spring.mvc.xml配置注意事项,spring中的事务失效,事务不回滚原因

    1.Spring中的applicationContext.xml配置错误导致的异常 异常信息: org.apache.ibatis.binding.BindingException: Invalid ...

  9. Node.js性能分析神器Easy-Monitor

    摘要: 使用Easy-Monitor,可以准确定位Node.js应用的性能瓶颈,帮助我们优化代码性能. 当应用出现性能问题时,最大的问题在于:如何准确定位造成性能瓶颈的代码呢?对于Node.js开发者 ...

  10. img图像标签和超链接标签a

    图像标签语法:<img src="" alt="".../> img属性:src=""  显示图像的URLalt="& ...