题目

定义一个函数,输入一个链表的头节点,反转链表并输出反转后链表的头节点。链表节点定义如下:

public static class ListNode{public int val;public ListNode next;public ListNode(int val) {this.val = val;}
}

分析

方法一:使用三个指针进行边移动边逆。

方法二:利用栈先进后出的性质进行反转链表。

放码

import java.util.LinkedList;
import com.lun.util.SinglyLinkedList.ListNode;public class ReverseList {//三指针操作public ListNode reverse(ListNode head){if(head == null) {return head;}ListNode a = head;ListNode b = a.next;ListNode c = null;while(a != null) {//真正改变转向a.next = c;//开始移位c = a;a = b;if(b != null)b = b.next;}return c;}//利用栈的先进后出性质public ListNode reverse2(ListNode head) {if(head == null) {return null;}LinkedList<ListNode> stack = new LinkedList<>();ListNode p = head;while( p != null) {stack.push(p);p = p.next;}ListNode result = stack.pop(), temp = null;;p = result;while(!stack.isEmpty()) {temp = stack.pop();temp.next = null;//防止最后元素死循环而造成的OOMp.next = temp;p = p.next;}return result;}}

测试

import static org.junit.Assert.*;import org.junit.Test;import com.lun.util.SinglyLinkedList;
import com.lun.util.SinglyLinkedList.ListNode;public class ReverseListTest {@Testpublic void testReverse() {ReverseList rl = new ReverseList();ListNode raw = SinglyLinkedList.intArray2List(new int[] {1, 2, 3, 4, 5, 6, 7});ListNode expected = SinglyLinkedList.intArray2List(new int[] {7, 6, 5, 4, 3, 2, 1});assertTrue(SinglyLinkedList.equals(rl.reverse(raw), expected));//---raw = SinglyLinkedList.intArray2List(new int[] {1});expected = SinglyLinkedList.intArray2List(new int[] {1});assertTrue(SinglyLinkedList.equals(rl.reverse(raw), expected));//---raw = SinglyLinkedList.intArray2List(new int[] {1, 2});expected = SinglyLinkedList.intArray2List(new int[] {2, 1});assertTrue(SinglyLinkedList.equals(rl.reverse(raw), expected));//---assertNull(rl.reverse(null));}@Testpublic void testReverse2() {ReverseList rl = new ReverseList();ListNode raw = SinglyLinkedList.intArray2List(new int[] {1, 2, 3, 4, 5, 6, 7});ListNode expected = SinglyLinkedList.intArray2List(new int[] {7, 6, 5, 4, 3, 2, 1});//System.out.println(SinglyLinkedList.print(rl.reverse2(raw)));assertTrue(SinglyLinkedList.equals(rl.reverse2(raw), expected));//---raw = SinglyLinkedList.intArray2List(new int[] {1});expected = SinglyLinkedList.intArray2List(new int[] {1});assertTrue(SinglyLinkedList.equals(rl.reverse2(raw), expected));//---raw = SinglyLinkedList.intArray2List(new int[] {1, 2});expected = SinglyLinkedList.intArray2List(new int[] {2, 1});assertTrue(SinglyLinkedList.equals(rl.reverse2(raw), expected));//---assertNull(rl.reverse2(null));}}

《剑指Offer》24:反转链表相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 24. 反转链表 Java

    <LeetCode力扣练习>剑指 Offer 24. 反转链表 Java 一.资源 题目: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1-& ...

  2. 【LeetCode】剑指 Offer 24. 反转链表

    剑指 Offer 24. 反转链表 文章目录 剑指 Offer 24. 反转链表 一.迭代 二.递归 总结 一.迭代 在遍历链表时,将当前节点的 next 指针改为指向前一个结点.由于结点没有引用其前 ...

  3. 【双100%解法】剑指 Offer 24. 反转链表

    立志用最少的代码做最高效的表达 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: ...

  4. 剑指offer 24. 反转链表

    1.问题描述 输入一个链表的头结点,反转链表后,输出新链表的表头. 2. 解决思路 1)链表是空的:直接返回空的头结点: 2)链表中只有一个结点:直接返回原头结点: 3)链表中有大于2个以上的结点:需 ...

  5. 剑指 Offer 24.反转链表

    题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 题目链接:反转链表 示例: 输入: 1->2->3->4->5->NULL 输出: 5-& ...

  6. Leetcode 剑指 Offer 24. 反转链表 (每日一题 20210823)

    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点.示例:输入: 1->2->3->4->5->NULL 输出: 5->4->3-> ...

  7. 剑指 Offer 24. 反转链表(C语言)

    **定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3- ...

  8. 【算法】剑指 Offer 24. 反转链表

    1.概述 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof 定义一个函数,输入一个链表的头节点, ...

  9. 剑指 Offer 24. 反转链表java

    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-&g ...

  10. 剑指Offer 24 反转链表

    迭代的思想就是利用pre和cur两个指针,然后逐步向后遍历 # Definition for singly-linked list. # class ListNode: # def __init__( ...

最新文章

  1. MATH6005 Final Assignment MATH6005 2018-19
  2. ajax更新,AJAX网址更新(AJAX URL update)
  3. linux目录为root所有文件,linux获取文件所有目录/文件夹的例子linux操作系统 -电脑资料...
  4. 神经网络与定态薛定谔方程
  5. 跨部门不配合工作_作为管理者,如何解决跨部门成员互不配合的情况?
  6. Linux系统编程26:进程间通信之进程间通信的基本概念
  7. 在线CSV转SQL工具
  8. systemtap打点方法
  9. win10 任务管理器显示GPU占用率
  10. 两个平面的位置关系和判定方程组解_必修二数学课后题答案
  11. 关于ESP8266和ESP8285的对比
  12. 爬取新浪微博热搜排行
  13. 51智能小车前进后退左右旋转
  14. 基于cefsharp的浏览器应用开发(支持XP系统)
  15. ucache灾备云报价_UCache云灾备体系介绍
  16. websocket连接不稳定_帮你解决WiFi卡顿:拒绝连接不稳定、网速慢
  17. 苹果一体机安装windows7教程
  18. blackberry j2me 发送SMS短信
  19. 音速启动vstart 目录作用详解
  20. 【听】跟任何人都聊得来,如何打破沟通障碍

热门文章

  1. 设计模式C++实现(6)——适配器模式
  2. 计算机辅助项目管理课程方案,天津大学计算机辅助管理研究生课程简介
  3. redis php怎么使用教程,PHP 使用redis
  4. k近邻算法_K近邻(knn)算法是如何完成分类的?
  5. 鸿蒙os开源邀请全球开发者,全场景无缝连接 鸿蒙OS开源邀请全球开发者共助生态发展...
  6. 英特网rst服务器未在运行,技术员示范win7系统提示“英特尔(R)RST服务未在运行”的详细办法...
  7. python中回车怎么表示_如何在python中使用读取行仅拆分回车符?
  8. SqlServer学习之触发器
  9. 04751计算机网络安全讲解,【19份】04751计算机网络安全自考试卷_历年真题自考答案及解析_湖南080901计算机科学与技术(原B080702计算机及应用)专业-自考生资料网...
  10. sqoop(数据迁移工具)-安装-学习