解题思路: 我们大概可以以这个题目给的情景给一个举例。设pre为前驱节点,cur为当前节点。当我们遍历到2的时候,2.next=3,pre的next节点是2,这时候,我们让2的后继变成前驱的后继,也就是2.next=pre.next,然后顺序就会变成1 3 2 4 5 ,这个时候,pre节点还是1,而2.next就变成了4。这时候,我们再让2.next=pre.next,顺序就会变成1 4 3 2 5了。
如果听不懂可以看我这段代码的注释,我把整体的结点值打印了,然后说明的文字是针对第一次循环去解读的,应该挺仔细的:
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode pre = dummy;
for(int i = 1 ; i<m ; i++){
pre = pre.next;
}
head = pre.next;
for(int i = m ; i<n ; i++){
ListNode node = head.next;//node是2的下一个节点.node=3
System.out.println(node.val);//3 4
head.next = node.next;//让3的下一个节点和2的下一个相同,相当于2->4
System.out.println(head.val);//2 2
node.next = pre.next;//让1的下一个节点也就是2变成node的下一个节点,相当于让3->2
System.out.println(node.val);//3 4
pre.next = node;//相当于让1->3,最后整体连接起来,第一次的迭代就是1->3->2->4->5
System.out.println(pre.next.val);//3 4
}
return dummy.next;
}
}