[LeetCode] LeetCode92. 反转链表II

发布时间 2023-12-13 09:23:21作者: Ac_c0mpany丶

题目描述

思路:同LeetCode25. K个一组翻转链表

  1. 因为涉及到可能链表的头节点会改变,所以设置dummy节点
  2. 先走left - 1步到达left的左边一个节点
  3. 查看后面是否存在right - left + 1个节点
  4. 先翻转内部节点指向right - left次
  5. 再翻转外部节点

方法一:

/**
 * 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 {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        // 因为涉及到可能链表的头节点会改变,所以设置dummy节点
		ListNode dummy = new ListNode(0, head);
        ListNode cur = dummy;
        // 先走left - 1步到达left的左边一个节点
		for (int i = 0; i < left - 1; i ++) {
            cur = cur.next;
        }
		// 查看后面是否存在right - left + 1个节点
        ListNode p = cur;
        for (int i = 0; i < right - left + 1 && p != null; i ++) {
            p = p.next;
        } 
        if (p == null) return null;
        ListNode node1 = cur.next;
        ListNode node2 = cur.next.next;
		// 先翻转内部节点指向right - left次
        for (int i = 0; i < right - left; i ++) {
            ListNode temp = node2.next;
            node2.next = node1;
            node1 = node2;
            node2 = temp;
        }
		// 再翻转外部节点
        ListNode temp = cur.next;
        cur.next = node1;
        temp.next = node2;
        return dummy.next;
    }
}