链表——将单链表从m到n的结点位置翻转
来源:互联网 发布:ps中文字体下载mac版 编辑:程序博客网 时间:2024/06/14 14:45
题目:反转链表从m-n位置的结点
For example:
Given1->2->3->4->5->NULL, m = 2 and n = 4,
return1->4->3->2->5->NULL.
从第二到第四的结点被反转了。
其中m和n满足条件:
1 ≤ m ≤ n ≤ length of list.
原地交换结点
public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { if(head == null||head.next == null) return head; if(m == n) return head; ListNode prefirst=null;//first的前一个结点 ListNode aftersecond=null;//second的后一个结点 ListNode first=head;//first引用第m个节点 ListNode second=null;//secone引用第n个节点 ListNode p=head; for(int i=1;i<=n;i++) { if(i == m-1)//注意m为1的情况 { prefirst=p; first=p.next; } if(i == n) { second=p; aftersecond=p.next; } p=p.next; } Pair pair=reverse(first,second); if(prefirst == null) head=pair.head; else prefirst.next=pair.head; pair.rear.next=aftersecond; return head; } // public Pair reverse(ListNode head,ListNode rear) { ListNode pre=head; ListNode cur=head.next; while(cur!=rear) { ListNode next=cur.next; cur.next=pre; pre=cur; cur=next; } cur.next=pre; pre=cur; rear=head; head=pre; Pair pair=new Pair(head,rear); return pair; } //定义内部类Pair存储reverse后的head和rear; class Pair { ListNode head; ListNode rear; public Pair(ListNode head,ListNode rear) { this.head=head; this.rear=rear; } }}
仍是逆序,仍考虑到用辅助空间stack.
将m-n的结点依次入栈,并标记与入栈结点相邻的前后两个结点pfirst和psecond
(若m==1,pfirst=null,不管n是否为length of list,对psecond的情况无影响。)
代码如下:
import java.util.*;public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { if(head==null) return null; if(m==n) return head; Stack<ListNode> stack=new Stack(); //将m-n的结点入栈,将前后相邻的两个结点标记; int num=1; ListNode pfirst=null; ListNode psecond=null; ListNode p=head; //特殊情况,m==1时,头结点变更; if(m==1) pfirst=null; for(;num<=n;num++) { //记录pfirst; if(num<m) { if(num==m-1) { pfirst=p; } p=p.next; } else if(num>=m&&num<=n) { stack.push(p); p=p.next; } } //记录psecond,psecond的一般情况仍适用于n=length of list的特殊情况; psecond=p; //开始操作链表; if(pfirst==null) { head=stack.pop(); pfirst=head; } while(!stack.empty()) { pfirst.next=stack.pop(); pfirst=pfirst.next; } pfirst.next=psecond; return head; }}
1 0
- 链表——将单链表从m到n的结点位置翻转
- 将单链表从m到n的结点位置翻转
- 输出从m到n的值、
- 【Java】给定两个32位的整数N与M,以及表示比特位置的i与j。编写一个方法,将M插入N,使得M从N的第 j 位开始,到第 i 位结束。
- 9.5位操作(一)——M插入N,使得M从N的第j位开始,到第i位结束
- 将链接列表从位置m反转到n。 在原位和一次通过。
- 约瑟夫问题,从o(n*m)到o(n)乃至o(m)的算法复杂度进阶
- SQL取出从M条到N条的数据
- 查询从N行到M行的记录
- 查询从m到n行的记录
- 输出从m到n的值(PHP实例)
- 关于n*m网格从左上到右下的走法数
- 给定两个32位的整数n和m,将m插进n的j到i的位置,n其他位置不变
- 取从M到N行
- 显示从N行到M行
- 从1到m随机n个数
- 2} 求从m到n的映射的个数 0 c} n{-2 b 设m={a
- 插入新结点到指定结点的指定位置
- 微信支付SDK-两行代码解决支付
- 数据模型代码
- Android开发中将状态栏改变成透明颜色
- 11.View的基础知识
- 搭建适合IOS的HTTP Live Streaming直播系统
- 链表——将单链表从m到n的结点位置翻转
- Ibatis之3个不常用的Query方法
- Android 百度地图 SDK v3.0.0 (一)
- 拼图响应式前端框架版响应式后台
- ubuntu下安装程序的三种方法
- 自定义搜索功能
- ShortJson关于JSON的思考
- c++无法解析的外部符号
- svn冲突