转载请注明出处,GitHub链接点击打开链接
原题
解题思路
迭代前
1、添加dummy节点(0)作为前驱节点,保持处理head节点时与其他节点一致,无需单独考虑;
2、链表往前迭代找到我们要处理的mNode(2),由于mNode也需要被处理,所以我们同时要找到mNode的前驱节点mPreviousNode(1);
3、node1 = mNode,node2 = mNode.next;
迭代中
1、反转,原先是node1->node2, 现在让node2->node1
2、node1与node2前进一步;
终止条件:nNode(4)已经被反转
迭代后
处理被反转的链表的头尾:mPreviousNode -> node1, mNode - > node2
图解
源代码
public class Solution92 {
public ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null)
return null;
int count = 0;
ListNode dummyNode = new ListNode(0);
dummyNode.next = head;
ListNode iteratorNode = dummyNode;
ListNode mPreviousNode, mNode, node1, node2, node3;
while (count < m-1){
iteratorNode = iteratorNode.next;
count++;
}
mPreviousNode = iteratorNode;
mNode = iteratorNode.next;
node1 = mNode;
node2 = mNode.next;
while (count < n-1){
count++;
node3 = (node2 == null) ? null : node2.next;
node2.next = node1;
node1 = node2;
node2 = node3;
}
mNode.next = node2;
mPreviousNode.next = node1;
return dummyNode.next;
}
}