输入一个链表,两个正数n,m表示逆置的范围,输出部分逆置后的链表
public class Main {
static class Node{
Node next;
int val;
public Node(int val) {
this.val = val;
}
}
public static void main(String [] str){
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(4);
Node n5 = new Node(5);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
Node head = reversePart(n1,2,4);
while(head!=null) {
System.out.println(head.val);
head = head.next;
}
}
public static Node reversePart(Node head,int from,int to) {
if(head == null) return head;
int len = 0;
Node node1 = head;
Node fpre = null; //form节点的前一个位置
Node tpos = null;//to节点的后一个位置
while(node1 != null) {
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!=tpos) {
next = node2.next;
node2.next = node1;
node1 = node2;
node2 = next;
}
if(fpre!=null) {
fpre.next = node1;
return head;
}
return node1;
}
}