题目:92. 反转链表 II
遍历链表,翻转区间,利用指针
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
解题:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
/*
解题思想:就是简单的链表遍历+翻转操作
分治思想
将链表分为三部分,0-m不动,m-n翻转,n-最大动;
要点:
翻转的时候,始终是第m结点的下一个节点连接到原m节点的位置上;
*/
public static ListNode reverseBetween(ListNode head, int m, int n) { // m < n
if (head == null || head.next == null || n - m <= 0) { // m >= n 排除
return head;
}
ListNode temp = new ListNode(-1);
temp.next = head;
ListNode m_prev_node = temp;
ListNode m_node = null;
ListNode cur = temp;
for (int i = 0; i <=n; i ++) {
for (;i <= m; i ++) {
if (i < m) {
m_prev_node = cur;
}
if (i == m) {
m_node = cur;
}
cur = cur.next;
}
System.out.println(m_prev_node.val + "," + m_node.val + "," + cur.val);
if (i > m && i <= n) {
// 当前节点与m节点断开,插入到原m节点的前置节点后面
m_node.next = cur.next;
ListNode tem = m_prev_node.next;
m_prev_node.next = cur;
cur.next = tem;
// 滑动当前节点指针
cur = m_node.next;
}
}
return temp.next;
}
}