package com.list;
public class LGNode {
private Integer val;
private LGNode next;
public LGNode() {
}
public LGNode(Integer val) {
this.val = val;
this.next = null;
}
public Integer getVal() {
return val;
}
public void setVal(Integer val) {
this.val = val;
}
public LGNode getNext() {
return next;
}
public void setNext(LGNode next) {
this.next = next;
}
@Override
public String toString() {
return "LGNode [val=" + val + ", next=" + next + "]";
}
}
package com.list;
public class LGLinkListII {
public static void main(String[] args) {
LGNode head = new LGNode(1);
LGNode node1 = new LGNode(2);
LGNode node2 = new LGNode(3);
LGNode node3 = new LGNode(4);
LGNode tail = new LGNode(5);
head.setNext(node1);
node1.setNext(node2);
node2.setNext(node3);
node3.setNext(tail);
LGNode newHead = reverseMToN(head,2,4);
StringBuilder sb = new StringBuilder();
while(newHead != null) {
sb.append(newHead.getVal());
newHead = newHead.getNext();
if(newHead != null) {
sb.append(" -> ");
}
}
System.out.println(sb.toString());
}
//假设m与n都是正常的情况,不越界,设定M为2,N为4
public static LGNode reverseMToN(LGNode head,Integer m,Integer n) {
if(head == null || m >= n) {
return head;
}
//定义一个dummy节点,
LGNode dummy = new LGNode(-1);
dummy.setNext(head);
head = dummy;
// -1 -> 1 -> 2 -> 3 -> 4 -> 5
// dummy
// head preM M N PostN
// 最终的preM指向N,M指向PostN
for(Integer index = 1 ;index < m; index ++) {
head = head.getNext();
}
//执行后的结果为
// -1 -> 1 -> 2 -> 3 -> 4 -> 5
// dummy
// head
LGNode preM = head;
LGNode mNode = head.getNext();
LGNode nNode = mNode;
LGNode postN = nNode.getNext();
for(Integer index = m;index < n;index++){
// -1 -> 1 -> 2 -> 3 -> 4 -> 5
//(1) preM (mNode,nNode) postN
//(2) preM (mNode) nNode postN
LGNode nextNode = postN.getNext();
postN.setNext(nNode);
nNode = postN;
postN = nextNode;
}
mNode.setNext(postN);
preM.setNext(nNode);
return dummy.getNext();
}
}