NC21 链表内指定区间反转

描述

将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 面试练习题(十二)_空间复杂度,空间复杂度 面试练习题(十二)_空间复杂度_02
例如:
给出的链表为 面试练习题(十二)_时间复杂度_03面试练习题(十二)_链表_04,
返回 面试练习题(十二)_时间复杂度_05.

数据范围: 链表长度 面试练习题(十二)_空间复杂度_06面试练习题(十二)_空间复杂度_07,链表中每个节点的值满足 面试练习题(十二)_空间复杂度_08

要求:时间复杂度 面试练习题(十二)_空间复杂度 ,空间复杂度 面试练习题(十二)_空间复杂度

进阶:时间复杂度 面试练习题(十二)_空间复杂度,空间复杂度 面试练习题(十二)_空间复杂度_02

示例1

输入:

{1,2,3,4,5},2,4

返回值:

{1,4,3,2,5}


代码解析:

import java.util.*;
public class Solution {
    public ListNode reverseBetween (ListNode head, int m, int n) {
        //加个表头
        ListNode res = new ListNode(-1); 
        res.next = head;
        //前序节点
        ListNode pre = res; 
        //当前节点
        ListNode cur = head; 
        //找到m
        for(int i = 1; i < m; i++){ 
            pre = cur;
            cur = cur.next;
        }
        //从m反转到n
        for(int i = m; i < n; i++){ 
            ListNode temp = cur.next;
            cur.next = temp.next;
            temp.next = pre.next;
            pre.next = temp;
        }
        //返回去掉表头
        return res.next; 
    }
}


class Solution:
    def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
        #加个表头
        res = ListNode(-1)
        res.next = head
        #前序节点
        pre = res 
        #当前节点
        cur = head 
        #找到m
        for i in range(1,m): 
            pre = cur
            cur = cur.next
        #从m反转到n
        for i in range(m, n): 
            temp = cur.next
            cur.next = temp.next
            temp.next = pre.next
            pre.next = temp
        #返回去掉表头
        return res.next