题目:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head == null || m > n){
return head;
}
ListNode dummy = new ListNode(-1);
dummy.next = head;
head = dummy;
for(int i = 1; i < m; i++){
head = head.next;
}
ListNode prevM = head;
ListNode mNode = head.next;
ListNode nNode = mNode;
ListNode postN = nNode.next;
for(int i = m; i < n; i++){
ListNode next = postN.next;
postN.next = nNode;
nNode = postN;
postN = next;
}
mNode.next = postN;
prevM.next = nNode;
return dummy.next;
}
}
解题思路:
第一步:创建哨兵节点(它有什么作用呢?当头节点需要变动时,有个哨兵节点会相对比较好操作)
第二步:
① 找到head节点;
② 定义节点
ListNode prevM = head; // 1
ListNode mNode = head.next; // 2
ListNode nNode = mNode; // 2
ListNode postN = nNode.next; // 3
第三步:
// mNode = nNode = 2; postN = 3
for(int i = m; i < n; i++){
ListNode next = postN.next;
postN.next = nNode;
nNode = postN;
postN = next;
}
第四步:
mNode.next = postN;
prevM.next = nNode;
图解: