2.在指定区间反转链表

题目:将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n)O(n),空间复杂度 O(1)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) {
        // write code here
        if(head == null) return null;
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode leftNode,rightNode,preLeftNode,postRightNode;
        preLeftNode = dummy;
        rightNode = head;
        for(int i=1;i<m;i++){
            preLeftNode = preLeftNode.next;
        }
        for(int i=1;i<n;i++){
            rightNode = rightNode.next;
        }
        leftNode = preLeftNode.next;
        postRightNode = rightNode.next;
        preLeftNode.next = null;
        rightNode.next = null;
        ListNode pHead = new ListNode(-1);
        pHead.next = leftNode;
        ListNode node = leftNode;
        while(leftNode != null){
            ListNode memo = leftNode.next;
            leftNode.next = pHead.next;
            pHead.next = leftNode;
            leftNode = memo;
        }
        preLeftNode.next = rightNode;
        node.next = postRightNode;
        
        
        return dummy.next;
        
    
        
        
        
    }
}

解法二:这个就是找到左区间前一个节点 左区间节点 然后每次都将左区间后一个节点采用头插法插入到左区间前一个结点的后一位上去 

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) {
        // write code here
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode preNode = dummy;
        for(int i=1;i<m;i++){
            preNode = preNode.next;
        }
        ListNode curr = preNode.next;
        for(int i=m;i<n;i++){
            ListNode memo = curr.next;
            curr.next = memo.next;
            memo.next = preNode.next;
            preNode.next = memo;
        }
        return dummy.next;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值