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.
Hide Tags Linked ListHide
Similar Problems (E) Reverse Linked List
对于本题,应该注意局部翻转与全部翻转的不同之处——局部翻转需要将翻转的部分与之前未翻转的部分拼接起来。
方法一:
<p>//方法一:有待改进</p>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 index=new ListNode(0);
ListNode p=index;
p.next=head;
ListNode cur=head;
int i=0;
for(;i<m-1;i++){
p=cur;
cur=cur.next;
}
ListNode pre=cur;
cur=cur.next;
ListNode next=null;
pre.next=cur;
n--;
for(;i<n;i++){
next=cur.next;
cur.next=p.next;
p.next=cur;
pre.next=next;
cur=next;
}
System.out.println(head.val);
return index.next;
}
}
方法二:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
//方法二:有待改进
/*
* 三个variable
* preM:指向反转部分的前一个元素。
* pre:指向已经反转成功的最后一个元素,反转前的第一个元素preM.next,不需要改动。
* cur:指向要插入prevM后面的那个元素。
* 算法:每次拿出右边的新元素,往preM后面插,最后cur==不需要反转的section的第一个节点时退出
*/
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 index=new ListNode(0);
index.next=head;
ListNode preM=index,pre=index,cur=index;
for(int i=1;i<=n;i++){
if(i<m){
preM=preM.next;
}else if(i==m){
pre=preM.next;
cur=pre.next;
}else{
pre.next=cur.next;
cur.next=preM.next;
preM.next=cur;
cur=pre.next;
}
}
return index.next;
}
}