博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode92. Reverse Linked List II
阅读量:6448 次
发布时间:2019-06-23

本文共 1219 字,大约阅读时间需要 4 分钟。

题目要求

Reverse a linked list from position m to n. Do it in-place and in one-pass.For example:Given 1->2->3->4->5->NULL, m = 2 and n = 4,return 1->4->3->2->5->NULL.Note:Given m, n satisfy the following condition:1 ? m ? n ? length of list.

将链表中从第m个节点开始翻转至第n个节点结束。要求在第一次遍历中即完成该过程。

思路一:管他的一次遍历

直观点想,我们只需要知道开始翻转的第一个节点和需要翻转的最后一个节点。将从第一个该节点开始依次插入最后一个节点后面直到遇到最后一个节点。该算法的时间复杂度为O(2n-m),即O(n+n-m)

public ListNode reverseBetween(ListNode head, int m, int n) {        if(m==n) return head;        ListNode dummy1 = new ListNode(0), dummy2 = new ListNode(0), start = new ListNode(0);        dummy1.next = head;        dummy2.next = head;        start.next = dummy2;        for(int i = 0 ; i 

思路二:one pass

那么有没有办法正向翻转呢。当然是可以的啦,换句话说,我们只要将节点不断往前插入就行啦。举题中的例子。1->2->3->4->5->NULL, m = 2 n = 4,

首先我们将数值3提取出来插入到1和2之间1-3-2-4-5
之后将数值4提取出来插入到1和2之间1-4-3-2-5
至此翻转结束。
也就是说我们在这个过程中需要知道3个节点,开始翻转的前一个节点prev,开始翻转的节点start,以及插入到前面的这个节点then。
最后我们还需要一个dummy节点来标记整个链表的起始节点。
代码如下:

public ListNode reverseBetween2(ListNode head, int m, int n){        if(m==n || head==null) return head;        ListNode dummy = new ListNode(0);        dummy.next = head;        ListNode prev = dummy;        for(int i = 0 ; i

clipboard.png

想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

转载地址:http://trlwo.baihongyu.com/

你可能感兴趣的文章
冒泡排序
查看>>
Kernel那些事儿之内存管理(1) --- 人在江湖
查看>>
Redis之持久化
查看>>
Java 创建线程的方式
查看>>
GreenPlum Primary/Mirror 同步机制
查看>>
济南职工常用
查看>>
tomcat生成ssl证书
查看>>
配完wp8 我想打人
查看>>
无聊时学习一下Calendar类,打印出小日历
查看>>
Linux的进程及计划任务
查看>>
java web开发(一)XML
查看>>
Ajax工作原理
查看>>
linux svn up 中文显示乱码解决办法
查看>>
Executor实现线程池
查看>>
linux关闭在线登录用户
查看>>
Linux系统之加密、解密、openssl的基本应用及CA的实现过程
查看>>
十五、AR数据库操作CRUD 之update
查看>>
邮箱服务器上所有用户的统计信息
查看>>
穷举法组合数值,求更精
查看>>
传苹果Siri中文版下月推出 支持更多国家语言
查看>>