链表之反转链表,万金油的解题方法(java求解)
链表之反转链表,一招鲜吃遍天(java求解)
内容目录
- 链表之反转链表,一招鲜吃遍天(java求解)
- 解题万金油
- 栗子1:反转整个链表
- 栗子2:反转某个区间内的链表
- 栗子3:按照k为一组,反转某个区间内的链表
链表的反转一类的算法题,在面试中经常被问,题目的花样也很多,整体反转、部分反转、分组反转等等。这类题的解法也是有很多种,递归、指针等等。
对于这种题,最核心的地方就是反转的逻辑怎么处理,其他的比如整体、部分这些,通过循环就可以解决。
解题万金油
反转的逻辑怎么写?很简单,记得一个就可以:
- 实例化一个空节点newHead,指向head
- 实例一个cur,作为newHead的下一个节点
- 实例一个cur_next,作为cur的next
- 另cur.next = cur_next.next
- cur_next.next = newHead.next
- newHead.next = cur_next
按照这几个步骤,做几个小栗子
栗子1:反转整个链表
描述:给定一个链表,翻转链表,并返回新的头节点head
输入:[1,2,3,4]
输出:[4,3,2,1]
返回:head=4
按照步骤:
// 实例一个空节点,指向head ListNode newHead = new ListNode(-1); newHead.next = head;
// 实例一个cur,作为newHead的下一个节点 ListNode cur = newHead.next;
// 实例一个cur_next,作为cur的next ListNode cur_next; cur_next = cur.next;
// 另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求解)相关推荐
- 输入一个链表,反转链表后,输出新链表的表头(ACM格式)(美团面试题)
输入一个链表,反转链表后,输出新链表的表头 其实这道题就是一个反转链表的题,但是因为自己不会建立链表,所以特地采用ACM的格式试着编写一下,这也美团给我出的一道实习算法题. public class ...
- 【算法】输入一个链表,反转链表后,输出新链表的表头。
题目 输入一个链表,反转链表后,输出新链表的表头. 示例1 输入 {1,2,3} 返回值 {3,2,1} 说明:本题目包含复杂数据结构ListNode Java /* public class Lis ...
- python反转链表_206. 反转链表(Python)
题目 难度:★★☆☆☆ 类型:链表 反转一个单链表. 进阶: 你可以迭代或递归地反转链表.你能否用两种方法解决这道题? 示例 输入: 1->2->3->4->5->NUL ...
- 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...
- day03链表基础_移除链表元素_设计链表_反转链表
链表理论基础 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思). 链表的入口节点称 ...
- Suzy找到实习了吗Day 3 | 链表开始啦 203移除链表元素 707设计链表 206 反转链表
定义链表的结构 class ListNode:def __init__(self, val, next=None): #构造函数self.val = valself.next = next 尾部nod ...
- leetcode链表之反转链表
本文主要有三道题,都是关于反转链表的算法题,由浅入深. 文章出现的代码都是python3 206.反转链表 题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 示例1: 输入:h ...
- 剑指offer算法题,输入一个链表,反转链表后,输出新链表的表头。
链表的算法题一直做的浑浑噩噩的,为了避免忘记以及能够及时的温故知新,所以将本次的解答记录如下: 话不多说,先贴代码: /* public class ListNode {int val;ListNod ...
- 输入一个链表,反转链表后,输出新链表的表头。
代码来自Java程序员面试笔试宝典 主要思想: pre cur next三个节点 /* public class ListNode {int val;ListNode next = null; ...
最新文章
- Android 4.2真坑爹
- 简单编程代码_好了好了,不闲扯了,我们开始学编程了
- vue前端用服务器上路径的图片展示_5分钟教你用nodeJS手写一个mock数据服务器
- 开发日记-20190603 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
- css中margin-top/margin-bottom失效
- 同一台服务器上面安装多个mysql数据库
- one-hot与哑变量(dummy variable)的区别
- Two sum(给定一个无重复数组和目标值,查找数组中和为目标值的两个数,并输出其下标)...
- Selenium UI自动化测试(四)Python+Unittest+HTMLTestRunner测试报告—百度hao123实例
- php object 对象不存在。增加对象_PHP开发自己的框架,这些知识点不能错过
- Juniper srx系列防火墙端口限速
- BZOJ2259[Oibh] 新型计算机
- Laravel 验证器
- 【题解】P3939数颜色
- 世界第 3 的滴滴裁员,求职季必知的独角兽公司排行榜
- pacemaker corosync 概念
- RPG Maker MV 做任务
- 小工具,大作用:教你如何利用EXCEL函数LINEST做回归分析
- 基于pgpool-II读写分离+postgresql10主从从流复制高可用部署方案
- STM32F407+FFT+详细解读!!!!
热门文章
- UE4制作尸潮爬墙学习笔记
- No Such Property: Scope For Class: Com.android.build.gradle.internal.variant.ApplicationVariantData
- 二维vector数组初始化方法
- bvs是什么意思_股票b和s是什么意思,区别原来这么简单
- layer.load()
- 中国软件缺少核心技术 自主创新是关健
- 液晶屏背光源该如何检测?
- Poly-encoders: architectures and pre-trainingstrategies for fast and accurate multi-sentence scorin
- 计算机配置赛扬 奔腾,intel 赛扬、奔腾、酷睿哪个好?
- 再谈 RocketMQ broker busy(实战篇)