题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
思路:就是常规的反转链表操作。为什么要添加 dummy 节点的,模拟一下链表只有两个节点,反转的范围为:1,2 的情况。
时间:O(n);
空间:O(1);
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param m int整型 * @param n int整型 * @return ListNode类 */ public ListNode reverseBetween (ListNode head, int m, int n) { if (m == n) return head; ListNode dummy = new ListNode(0); dummy.next = head; ListNode preNode = dummy; // 记录第 m-1 个节点 ListNode left; // 记录第 m 个节点 ListNode pre = dummy; ListNode cur = pre.next; int k = n - m; // 找到第 m 个节点以及di m-1 个节点,pre 为第 m 个节点, while (m > 0) { if (m == 1) preNode = pre; pre = pre.next; cur = cur.next; m--; } left = pre; // 开始反转 while(k>0 && cur != null){ ListNode temp = cur.next; cur.next = pre; pre = cur; cur = temp; k--; } // 特殊处理 preNode.next = pre; left.next = cur; return dummy.next; } }