本文主要是介绍【算法刷题】【链表】链表内指定区间反转:将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度)O(1)。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目
解题
import java.util.*;/** public class ListNode {* int val;* ListNode next = null;* public ListNode(int val) {* this.val = val;* }* }*/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// 构建三个节点,辅助,且不改变原来的head链表ListNode dummy = new ListNode(0);dummy.next = head;ListNode preStart = dummy;ListNode start = head;// 一直遍历到需要进行反转的点for (int i = 1; i < m; i ++ ) {preStart = start;start = start.next;}// 此时pre 在第m-1个位置 和 start 在第m个位置上/**开始翻转,这里的逻辑有点像冒泡,但又不是,只是神似*/// 操作的次数仅需要n-m+1次即可,因为就这么多个数据需要翻转for(int i=0 ;i<n-m;i++){/**翻转的逻辑是将temp不断地插入到prestart后面,temp必须是整理过的:永远是当前start结点指的那个节点*/ListNode temp = start.next;start.next = temp.next;temp.next = preStart.next;preStart.next = temp;}// 这样head 列表也不会改变,这里的解题思路的核心是添加了两个辅助节点 和 通过类似原地翻转的逻辑思路实现翻转/return dummy.next;}
}
这篇关于【算法刷题】【链表】链表内指定区间反转:将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度)O(1)。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!