92.反转链表II [中等]

146 阅读1分钟

题目

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

图片.png

  • 来源:力扣(LeetCode)
  • 链接:leetcode-cn.com/problems/re…
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码


public ListNode reverseBetween(ListNode head, int left, int right) {
    ListNode dummyHead = new ListNode();
    dummyHead.next = head;
    ListNode pre = dummyHead;
    for (int i = 1; i < left; i++) {
        pre = pre.next;
    }

    ListNode p = pre.next;
    for (int i = left; i < right; i++) {
        ListNode next = p.next;
        p.next = next.next;
        next.next = pre.next;
        pre.next = next;
    }

    return dummyHead.next;
}

update20220406

思路

找到开始反转的前一个节点,不停的头插法。

public ListNode reverseBetween(ListNode head, int left, int right) {
    ListNode dummyHead = new ListNode();
    dummyHead.next = head;
    ListNode pre = dummyHead;
    ListNode p = head;
    for (int i = 1; i < left; i++) {
        pre = pre.next;
        p = p.next;
    }
    
    for (int i = left; i < right; i++) {
        ListNode next = p.next.next;
        p.next.next = pre.next;
        pre.next = p.next;
        p.next = next;
    }
    
    return dummyHead.next;
}