链表之反转部分单向链表
2015-12-20 23:56
417 查看
package com.chenyu.zuo.linkedList; import com.chenyu.zuo.linkedList.RemoveByRatio.Node; /** * 题目:给定一个单向链表的头结点head,以及两个整数from和to * ,在单项链表上把第from个节点和第to个节点这一部分进行反转 * 列如: * 1->2->3->4->5->null,from=2,to=4 * 结果:1->4->3->2->5->null * 列如: * 1->2->3->null from=1,to=3 * 结果为3->2->1->null * * 要求 * 1、如果链表长度为N,时间复杂度要求为O(N),额外空间复杂度要求为O(1) * 2、如果不满足1<=from<=to<=N,则不调整 * * 思路:先判断是否满足1<=from<=to<=N * 先找到from-1个节点fPre,和to+1个节点tPos,fPre,tPos分别是反转的前一个节点和后 一个节点,反准部分反转后 * 然后连接fPre和tPos,如果fPre为null,则说明反转部分包含头结点,则返回新的头结点,也就是没反转之前反转部分 * 的最后一个节点,如果fPre不为null,子返回旧的头结点 * @author Think * */ public class ReversePart { public static class Node{ public int value; public Node next; public Node(int value){ this.value=value; } } public Node reversePart(Node head,int from,int to){ int len=0; Node node1=head; Node fPre=null; Node tPos=null; while(node1!=null){ //得到len fPre tPos的值 len++; fPre=len==from-1?node1:fPre; tPos=len==to+1?node1:tPos; node1=node1.next; } if(from>to || from<1 || to >len){ return head; } node1=fPre==null?head:fPre.next; Node node2=node1.next; node1.next=tPos; Node next=null; while(node2!=null){ next=node2.next; node2.next=node1; node1=node2; node2=next; } if(fPre!=null){ fPre.next=node1; return head; } return node1; } }
相关文章推荐
- 2-Twentieth Scrum Meeting-20151220
- Android Accessibility
- 1000,1001,1089~1096
- 1.使用UISearchController制作一个简单的本地搜索应用
- 自考实践课——数据库
- 敏捷测试的特点
- 写一个方法完成如下功能,判断从文本框textbox1输入的一个字符,如果是数字则求该数字的阶乘,如果是小写字条,则转换为大写,大写字符不变,结果在文本框textbox2中显示
- 转: JAVA递归算法实例小结
- 使用DataTable和DataSet的区别
- Servlet 中文乱码问题及解决方案剖析
- 分享一个C#编写简单的聊天程序(详细介绍)
- pyspider 爬虫教程
- ssh配置无密码登入详解
- 《Linux命令、编辑器与Shell编程》读书笔记7-Linux系统管理
- Nginx实现IIS负载均衡
- asp.net Operation failed, unable to locate the solution directory
- android微信支付(问题总结)
- 题解---2015年浙江理工12月校赛
- 基于zepto.js、touch.js开发的图片查看器
- Daily Scrum NO.9