题目描述:
吐槽:链表反转的升级版本,细致的题目,思路写完debug一点点调试,怎么都能过。修改完成总结一下会有比较大的收获。
代码:
public static ListNode reverseBetween(ListNode head, int m, int n) {
//统计节点的个数
int count = 1;
//保存头部节点,用于返回值
ListNode first = head;
//反转链表需要的两个标记位顺序是 pre head next
ListNode pre = null;
ListNode next;
//1.将head标记位移动到m的位置
while(head!=null&&count<m){
pre = head;
head = head.next;
next = head.next;
count++;
}
//firstNode为需要反转节点的前一个位置。firstNextNode需要反转的节点
ListNode firstNode = pre;
ListNode firstNextNode = head;
//2.把从m位置开始的节点进行链表的反转此时,head在n+1的位置。(我的反转逻辑只有在n+1的位置时,才能使m~n的节点都进行翻转)
while(head!=null&&count<=n){
next = head.next;
head.next = pre;
pre = head;
head = next;
count++;
}
//secondNode反转的最后一个节点,secondNextNode反转最后一个节点的下一个节点。
ListNode secondNode = pre;
ListNode secondNextNode = head;
//3.情况分割:(1)当m>1的时候,将存储的4个节点进行拼接返回存储好的第一个节点,first
//(2)当m=1的时候,将存储的4个节点进行拼接,返回进行翻转的最后一个节点secondNode。
if(m > 1){
firstNode.next = secondNode;
firstNextNode.next = secondNextNode;
return first;
}else{
first.next = secondNextNode;
return secondNode;
}
}