92. 反转链表 II

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

思路:

  • 扫描一趟完成,先走到需要反转的地方,记录反转节点的前一个节点为连接节点 con;
  • 反转的第一个节点为 反转链表的尾节点,记为 tail;
  • 在 m ~ n区间反转链表,反转链表结束后,头结点为 pre,下一个正常节点为 cur;
  • 则 con -> pre , tail -> cur,当 m==1时, con为null,需要特殊处理。

class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode pre = null, cur = head;
        while(m > 1){
            pre = cur; //先走到需要反转的地方,记录反转的前一个节点为 pre
            cur = cur.next; //记录需要反转的起始节点为 cur
            m--;
            n--;
        }
        ListNode con = pre, tail = cur; // m == 1时,con == null
        //记录链接节点为 con,反转中的尾节点为 tail
        ListNode tmp = null; //记录反转中的,下一个头结点
        while( n > 0){
            tmp = cur.next;
            cur.next = pre; //反转链表
            pre = cur;
            cur = tmp;
            n--;
        }
        if(con == null) head = pre; //如果连接点为 null 值,更新头结点
        else con.next = pre; //否则,反转节点的头节点,与前面的连接点链接起来
        tail.next = cur; //反转节点的尾节点,连接到剩余节点
        return head;
    }
}
原文地址:https://www.cnblogs.com/luo-c/p/13969988.html