题目
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
- 说明:
1 ≤ m ≤ n ≤ 链表长度。 - 示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
算法思路
首先找到要反转的位置,从n位置开始。
要反转一个结点cur:
- 要使用prev引用记住它的前结点
- 再一个curNext引用记住它的后驱结点
- 反转下一个时,更新prev和curNext
反转2~4位置结点
到这里还没有结束:
还需要将1的next改为4结点
2的next改为5结点
所以最开始之前,必须借用front引用保存m位置的前驱prev。
找到m位置后,使用引用rear保存此节点。
最后改变引用指向:
- 这里还要注意m位置若是从1开始的画front==null,本例中表示从1开始,但要把这种情况考虑进去。
- 最后分两种情况:
(1)front==null: 此时头结点变为prev,rear.next=cur;
(2)front!=null:front.next=prev,rear.next=cur.
代码
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head==null){
return null;
}
ListNode cur=head;
ListNode prev=null;
while(m>1){
prev=cur;
cur=cur.next;
m--;
n--;
}
ListNode front=prev;
ListNode uu=cur;
ListNode curNext=null;
while(n>0){
curNext=cur.next;
cur.next=prev;
prev=cur;
cur=curNext;
n--;
}
if(front!=null){
front.next=prev;
}
else{
head=prev;
}
uu.next=cur;
return head;
}
}
来源:CSDN
作者:珠穆朗玛峰上的珠穆朗玛峰
链接:https://blog.csdn.net/qq_44267206/article/details/104574605