天天看点

反转指定区间的链表

class ListNode {
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
        this.next = null;
    }

    public ListNode(){}

}
  /**
     * @description 反转指定位置的节点  [1,2,3,4,5],start=2, end=4 -> [1,4,3,2,5]
     * @author HelloWorld
     * @create 2022/10/30 16:15
     * @param head
     * @param left
     * @param right
     * @return com.wy.leetcode.linkedlist.ListNode
     */
public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode cur = new ListNode();
        cur.next = head;

        // 1.先找到开始反转定节点; 让temp指向要开始反转定节点, cur.next = temp;
        ListNode pre = cur;
        for (int i = 1; i < left; i++) {
            pre = pre.next;
        }
        head = pre.next;

        // 2.反转
        // 反转后的头节点
        ListNode reversedHead = new ListNode();
        // 反转后的头节点的尾节点
        ListNode reversedTail = new ListNode();
        for (int i = left; i <= right ; i++) {
            ListNode temp = new ListNode(head.val);
            if (i == left) {
                reversedTail = temp;
            }
            temp.next = reversedHead;
            reversedHead = temp;

            head = head.next;
        }

        // 3.组装
        pre.next = reversedHead;
        reversedTail.next = head;

        return cur.next;
    }