链表之反转链表,一招鲜吃遍天(java求解)

内容目录

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

链表的反转一类的算法题,在面试中经常被问,题目的花样也很多,整体反转、部分反转、分组反转等等。这类题的解法也是有很多种,递归、指针等等。

对于这种题,最核心的地方就是反转的逻辑怎么处理,其他的比如整体、部分这些,通过循环就可以解决。

解题万金油

反转的逻辑怎么写?很简单,记得一个就可以:

  1. 实例化一个空节点newHead,指向head
  2. 实例一个cur,作为newHead的下一个节点
  3. 实例一个cur_next,作为cur的next
  4. 另cur.next = cur_next.next
  5. cur_next.next = newHead.next
  6. newHead.next = cur_next

按照这几个步骤,做几个小栗子

栗子1:反转整个链表

描述:给定一个链表,翻转链表,并返回新的头节点head

输入:[1,2,3,4]
输出:[4,3,2,1]
返回:head=4

按照步骤:

  1. // 实例一个空节点,指向head
    ListNode newHead = new ListNode(-1);
    newHead.next = head;
    
  2. // 实例一个cur,作为newHead的下一个节点
    ListNode cur = newHead.next;
    
  3. // 实例一个cur_next,作为cur的next
    ListNode cur_next;
    cur_next = cur.next;
    
  4. // 另cur.next = cur_next.next
    cur.next = cur_cur_next.next;
    // cur_next.next = newHead.next
    cur_next.next = newHead.next;
    // newHead.next = cur_next
    newHead.next = cur_next;
    

补充上我们要在哪些地方进行翻转,也就是空值循环范围,完整代码

public ListNode ReverseList(ListNode head) {ListNode myNode = new ListNode(-1);myNode.next = head;ListNode ptr = myNode;ListNode cur = ptr.next;ListNode cur_next;while(cur != null && cur.next != null){cur_next = cur.next;cur.next = cur_next.next;cur_next.next = ptr.next;ptr.next = cur_next;}return myNode.next; }

栗子2:反转某个区间内的链表

描述:给定一个链表,和一个区间,只翻转链表的这个区间内的数据

输入:[1,2,3,4,5]  (2,4)
输出:[1,4,3,2,5]
返回:head:1

按照步骤,翻转部分都是不变的,只是我们把指针移到要翻转的地方就可以

public ListNode reverseBetween (ListNode head, int m, int n) {// write code hereListNode myNode = new ListNode(-1);myNode.next = head;ListNode ptr = myNode;// 前面的不需要变动for(int i = 0; i < m-1; i++){ptr = ptr.next;}// 从这里开始翻转ListNode cur = ptr.next;ListNode cur_next;for(int i = 0; i < n - m; i++){cur_next = cur.next;cur.next = cur_next.next;cur_next.next = ptr.next;ptr.next = cur_next;}   // 后面的不用动,直接返回return myNode.next;}

栗子3:按照k为一组,反转某个区间内的链表

描述:给定一个链表,和一个区间,只翻转链表的这个区间内的数据

输入:[1,2,3,4,5]  (3)
输出:[3,2,1,4,5]
返回:head:3

可以按照k进行分组,两层循环对每个组内的链表进行翻转

public ListNode reverseKGroup (ListNode head, int k) {// write code here// 如果链表为空返回nullif (head == null) return null;if (k == 1) return head;// 链表长度int len = getLength(head);// 按照k进行分组,该链表可以分为num组,个数不到k的不处理int num = len / k;// 定义一个node,指向第一个节点ListNode newNode = new ListNode(-1);newNode.next = head;ListNode ptr = newNode;ListNode cur_next;ListNode cur;// 按照分组遍历for(int i = 0; i < num; i++){cur = ptr.next;// 对每一组的数据处理for(int j = 0; j < k-1; j++){cur_next = cur.next;cur.next = cur_next.next;cur_next.next = ptr.next;ptr.next = cur_next;}ptr = cur;}return newNode.next;}// 获取链表长度public int getLength(ListNode head){int i = 0;while (head != null){head = head.next;i += 1;}return i;}

这类题的关键就是对于不同范围的翻转链表,我们应该怎么处理newHead节点在哪,也就是翻转从哪里开始到哪里结束的问题。多刷一些这个类型的题,问题就迎刃而解了。

链表之反转链表,万金油的解题方法(java求解)相关推荐

  1. 输入一个链表,反转链表后,输出新链表的表头(ACM格式)(美团面试题)

    输入一个链表,反转链表后,输出新链表的表头 其实这道题就是一个反转链表的题,但是因为自己不会建立链表,所以特地采用ACM的格式试着编写一下,这也美团给我出的一道实习算法题. public class ...

  2. 【算法】输入一个链表,反转链表后,输出新链表的表头。

    题目 输入一个链表,反转链表后,输出新链表的表头. 示例1 输入 {1,2,3} 返回值 {3,2,1} 说明:本题目包含复杂数据结构ListNode Java /* public class Lis ...

  3. python反转链表_206. 反转链表(Python)

    题目 难度:★★☆☆☆ 类型:链表 反转一个单链表. 进阶: 你可以迭代或递归地反转链表.你能否用两种方法解决这道题? 示例 输入: 1->2->3->4->5->NUL ...

  4. 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...

  5. day03链表基础_移除链表元素_设计链表_反转链表

    链表理论基础 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思). 链表的入口节点称 ...

  6. Suzy找到实习了吗Day 3 | 链表开始啦 203移除链表元素 707设计链表 206 反转链表

    定义链表的结构 class ListNode:def __init__(self, val, next=None): #构造函数self.val = valself.next = next 尾部nod ...

  7. leetcode链表之反转链表

    本文主要有三道题,都是关于反转链表的算法题,由浅入深. 文章出现的代码都是python3 206.反转链表 题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 示例1: 输入:h ...

  8. 剑指offer算法题,输入一个链表,反转链表后,输出新链表的表头。

    链表的算法题一直做的浑浑噩噩的,为了避免忘记以及能够及时的温故知新,所以将本次的解答记录如下: 话不多说,先贴代码: /* public class ListNode {int val;ListNod ...

  9. 输入一个链表,反转链表后,输出新链表的表头。

    代码来自Java程序员面试笔试宝典 主要思想: pre   cur   next三个节点 /* public class ListNode {int val;ListNode next = null; ...

最新文章

  1. Android 4.2真坑爹
  2. 简单编程代码_好了好了,不闲扯了,我们开始学编程了
  3. vue前端用服务器上路径的图片展示_5分钟教你用nodeJS手写一个mock数据服务器
  4. 开发日记-20190603 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  5. css中margin-top/margin-bottom失效
  6. 同一台服务器上面安装多个mysql数据库
  7. one-hot与哑变量(dummy variable)的区别
  8. Two sum(给定一个无重复数组和目标值,查找数组中和为目标值的两个数,并输出其下标)...
  9. Selenium UI自动化测试(四)Python+Unittest+HTMLTestRunner测试报告—百度hao123实例
  10. php object 对象不存在。增加对象_PHP开发自己的框架,这些知识点不能错过
  11. Juniper srx系列防火墙端口限速
  12. BZOJ2259[Oibh] 新型计算机
  13. Laravel 验证器
  14. 【题解】P3939数颜色
  15. 世界第 3 的滴滴裁员,求职季必知的独角兽公司排行榜
  16. pacemaker corosync 概念
  17. RPG Maker MV 做任务
  18. 小工具,大作用:教你如何利用EXCEL函数LINEST做回归分析
  19. 基于pgpool-II读写分离+postgresql10主从从流复制高可用部署方案
  20. STM32F407+FFT+详细解读!!!!

热门文章

  1. UE4制作尸潮爬墙学习笔记
  2. No Such Property: Scope For Class: Com.android.build.gradle.internal.variant.ApplicationVariantData
  3. 二维vector数组初始化方法
  4. bvs是什么意思_股票b和s是什么意思,区别原来这么简单
  5. layer.load()
  6. 中国软件缺少核心技术 自主创新是关健
  7. 液晶屏背光源该如何检测?
  8. Poly-encoders: architectures and pre-trainingstrategies for fast and accurate multi-sentence scorin
  9. 计算机配置赛扬 奔腾,intel 赛扬、奔腾、酷睿哪个好?
  10. 再谈 RocketMQ broker busy(实战篇)