题目:

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

struct ListNode{int m_nKey,ListNode * m_pNext;
}

思路:

为了正确地反转一个链表,需要调整链表中指针的方向。为了将复杂的过程说清楚,这里借助于下面的这张图片。

上面的图中所示的链表中,h、i和j是3个相邻的结点。假设经过若干操作,我们已经把h结点之前的指针调整完毕,这个结点的m_pNext都指向前面的一个结点。接下来我们把i的m_pNext指向h,此时结构如上图所示。

从上图注意到,由于结点i的m_pNext都指向了它的前一个结点,导致我们无法在链表中遍历到结点j。为了避免链表在i处断裂,我们需要在调整结点i的m_pNext之前,把结点j保存下来。

即在调整结点i的m_pNext指针时,除了需要知道结点i本身之外,还需要i的前一个结点h,因为我们需要把结点i的m_pNext指向结点h。同时,还需要实现保存i的一个结点j,以防止链表断开。故我们需要定义3个指针,分别指向当前遍历到的结点、它的前一个结点及后一个结点。故反转结束后,新链表的头的结点就是原来链表的尾部结点。尾部结点为m_pNext为null的结点。

代码实现:

public class ListNode {public int data;public ListNode next;
}
public ListNode reverseList(ListNode pHead){ListNode pReversedHead = null; //反转过后的单链表存储头结点ListNode pNode = pHead; //定义pNode指向pHead;ListNode pPrev = null; //定义存储前一个结点while(pNode != null){ListNode pNext = pNode.next; //定义pNext指向pNode的下一个结点if(pNext==null){ //如果pNode的下一个结点为空,则pNode即为结果pReversedHead = pNode;}pNode.next = pPrev; //修改pNode的指针域指向pPrevpPrev = pNode; //将pNode结点复制给pPrevpNode = pNext; //将pNode的下一个结点复制给pNode}return pReversedHead;
}

小结:

这道题考查我们是否真正的理解了单链表的结构,以及在反转单链表时对指针的修改。

扩展:

我们知道这个题其实是可以用递归实现使单链表变成反转链表。

代码实现:

public ListNode reverseList3(ListNode pHead){if(pHead==null || pHead.next == null){ //如果没有结点或者只有一个结点直接返回pHeadreturn pHead;}ListNode pNext = pHead.next; //保存当前结点的下一结点pHead.next = null; //打断当前结点的指针域ListNode reverseHead = reverseList3(pNext); //递归结束时reverseHead一定是新链表的头结点pNext.next = pHead; //修改指针域return reverseHead;
}

小结:

条条大路通罗马,时刻谨记能否递归来解决。

反转链表(Java)相关推荐

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

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

  2. 《LeetCode力扣练习》第206题 反转链表 Java

    <LeetCode力扣练习>第206题 反转链表 Java 一.资源 题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 示例 1: 输入:head = [1,2, ...

  3. 反转链表JAVA算法_链表反转算法

    1 packagecom.trs.codetool.sort;2 3 /** 4 *@authorzheng.changgang5 * @date 2020-01-02 09:576 * 链表的常见算 ...

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

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

  5. [Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]

    [问题描述][第25题][K个一组反转链表][困难] 时间复杂度:O(N^2) 空间复杂度:O(1) ```java 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数, ...

  6. java 链表反转_面试必备 | 不可不会的反转链表

    反转链表这题真的是面试非常喜欢考的了,这题看起来简单,但是能用两种方法一遍 bug free 也是不容易的,面试的时候可以筛下来一大批人,无论是对 junior 还是 senior 面试都很爱考.今天 ...

  7. 链表之反转链表,万金油的解题方法(java求解)

    链表之反转链表,一招鲜吃遍天(java求解) 内容目录 链表之反转链表,一招鲜吃遍天(java求解) 解题万金油 栗子1:反转整个链表 栗子2:反转某个区间内的链表 栗子3:按照k为一组,反转某个区间 ...

  8. Java - 反转链表

    目标是反转链表,效果如下: 观察要实现以上效果,需要达成什么条件,然后挨个拆解: 需要一个链表 链表遍历 反转函数 测试用例 那么ok,挨个实现以上条件即可 1.构造链表:链表是一种递归结构,每一个节 ...

  9. 【JAVA】PAT 乙级 1025 反转链表(测试点5超时,牛客网通过)

    [JAVA]PAT 乙级 1025 反转链表(测试点5超时,牛客网通过) 题目链接 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5 ...

  10. 【Java】LeetCode 206 反转链表

    题目 :给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 解题思路 : 1.根据以上代码 ,来进行反转链表的操作: 2.最后实现的效果为: 具体思路: 1.首先判断如果链表为空的话, ...

最新文章

  1. 重庆社区计算机考试题库,2020重庆社区工作者考试题库:模拟题100题(64)
  2. 2020牛客多校第3场:[Points Construction Problem + 思维题+构造]
  3. GP官网上的TEE学习课程和费用介绍
  4. android fragment onHiddenChanged的使用
  5. 微信小程序继续入坑指南
  6. LeetCode 1548. The Most Similar Path in a Graph(动态规划)
  7. android 梯形按钮_PLC编程入门梯形图实例讲解
  8. Unity 自定义Log系统
  9. 计算机考试怎么切换到桌面,考试系统很多考试系统全屏无法切换桌面,只能 – 手机爱问...
  10. 12CPU数据通路的功能和基本结构
  11. 打开微信键盘自动弹出_微信一打开就弹出键盘 微信打字键盘怎么恢复
  12. 几款任意波形发生卡推荐
  13. matlab清除历史数据,以前在MATLAB中打开过的m文件的历史记录
  14. 微信内置浏览器API的常用的js方法
  15. 【HighChart教程】编程语言详细程度的互动比较
  16. 1000w+条中国大陆企业工商注册信息数据集
  17. 2022微软实习面经 | 关于实习面试的所有问题,都能在这里找到答案
  18. 驾照科目一速过技巧--2023年
  19. 论文笔记---Topological acoustics
  20. 【python pypy】pypy安装

热门文章

  1. 有关matlab裁剪图片方面
  2. 网络带宽和下载速度的换算方法
  3. 使用curl控制下载速度
  4. aria2 网页版服务器错误,aria2服务器错误
  5. 安微六安二中2021高考成绩查询,喜报!六安一中、六安二中、毛坦厂中学......高考“成绩单”出炉...
  6. gis热力专题图制作
  7. 播放视频时过滤播霸浏览器
  8. 警告: Establishing SSL connection without server
  9. LaTeX中参考文献的插入方式(不使用BibTeX)
  10. unbuntu samba共享文件夹