链表内指定区间反转

题目描述

将一个链表m位置到n位置之间的区间反转。其中:1 <= m <= n <= 链表长度

示例

1 -> 2 -> 3 -> 4 -> 5 ->null, m = 2, n = 4

=> 1 -> 4 -> 3 -> 2 -> 5 -> null

解决方法

  1. 定位到待反转的链表区间头,并记录
  2. 定位到待反转的链表区间尾,并记录
  3. 反转区间链表
  4. 前后连接

时间复杂度:O(n)

空间复杂度:O(1)

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    
    
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    public ListNode reverseBetween (ListNode head, int m, int n) {
    
    
        if (head == null || head.next == null) {
    
    
            return head;
        }
        ListNode preNode = null;
        ListNode phead = head;
        for (int i = 1; i < m; i++) {
    
    
            preNode = phead;
            phead = phead.next;
        }
        ListNode ptail = phead;
        for (int i = 0; i < n - m; i++) {
    
    
            ptail = ptail.next;
        }
        ListNode nextNode = ptail.next;
        ptail.next = null;
        if (preNode == null) {
    
    				//特殊情况处理
            head = reverse(phead);
        } else {
    
    
            preNode.next = reverse(phead);
        }
        phead.next = nextNode;
        return head;
    }
    
    public ListNode reverse (ListNode head) {
    
    
        if (head == null || head.next == null) {
    
    
            return head;
        }
        ListNode preNode = head;
        ListNode target = head.next;
        while (target != null) {
    
    
            preNode.next = target.next;
            target.next = head;
            head = target;
            target = preNode.next;
        }
        return head;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44723496/article/details/113125774