36.Reverse Linked List II-翻转链表 II(中等题)

本文介绍了一种在链表中翻转指定区间的算法,包括使用栈辅助的翻转方法和更为高效的原地翻转方法,并附带了详细的代码实现。

翻转链表 II

  1. 题目

    翻转链表中第m个节点到第n个节点的部分

    注意事项
    m,n满足1 ≤ m ≤ n ≤ 链表长度

  2. 样例

    给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null

  3. 挑战

    在原地一次翻转完成

  4. 题解

1.Stack法
对于要翻转部分的节点,用Stack辅助进行翻转,然后再与首尾部分进行拼接。

/**
 * Definition for ListNode
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    /**
     * @param ListNode head is the head of the linked list 
     * @oaram m and n
     * @return: The head of the reversed ListNode
     */
    public ListNode reverseBetween(ListNode head, int m , int n) {
        if (m == n)
        {
            return head;
        }
        int count = 1;
        ListNode newHead = new ListNode(1);
        newHead.next = head;
        ListNode mPre = newHead;
        ListNode nTail = null;
        Stack<ListNode> stack = new Stack<>();
        while (head != null)
        {
            if (count < m)
            {
                mPre = mPre.next;
            }
            else if (count >= m && count <= n)
            {
                stack.push(head);
                if (count == n)
                {
                    nTail = head.next;
                    break;
                }
            }
            head = head.next;
            count++;
        }
        while (!stack.isEmpty())
        {
            mPre.next = stack.pop();
            mPre = mPre.next;
        }
        mPre.next = nTail;
        return newHead.next;
    }
}

2.原地翻转
为了方便处理,先给链表加上一个头结点dummy,dummy->1->2->3->4->5->null。然后将head指向dummy节点,开始遍历链表,将head移动到第一个需要翻转的节点的前节点,即head指向1。
先保存3的后继节点,再将节点3指向其前节点2,变成dummy->1->2<-3 4->5->null,再将节点后移一位,继续处理节点3和节点4,。最后将节点首尾相连即可。

/**
 * Definition for ListNode
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    /**
     * @param ListNode head is the head of the linked list 
     * @oaram m and n
     * @return: The head of the reversed ListNode
     */
    public ListNode reverseBetween(ListNode head, int m , int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        head = dummy;
        for (int i = 1; i < m; i++) 
        {
            head = head.next;
        }

        ListNode mNode = head.next;
        ListNode nNode = mNode;
        ListNode postnNode = mNode.next;
        for (int i = m; i < n; i++) 
        {
            ListNode temp = postnNode.next;
            postnNode.next = mNode;
            mNode = postnNode;
            postnNode = temp;
        }
        nNode.next = postnNode;
        head.next = mNode;

        return dummy.next;
    }
}

Last Update 2016.9.26

基于蒙特卡洛法的规模化电动车有序充放电及负荷预测(Python&Matlab实现)内容概要:本文围绕“基于蒙特卡洛法的规模化电动车有序充放电及负荷预测”展开,结合PythonMatlab编程实现,重点研究大规模电动汽车在电网中的充放电行为建模与负荷预测方法。通过蒙特卡洛模拟技术,对电动车用户的出行规律、充电需求、接入时间与电量消耗等不确定性因素进行统计建模,进而实现有序充放电策略的优化设计与未来负荷曲线的精准预测。文中提供了完整的算法流程与代码实现,涵盖数据采样、概率分布拟合、充电负荷聚合、场景仿真及结果可视化等关键环节,有效支撑电网侧对电动车负荷的科学管理与调度决策。; 适合人群:具备一定电力系统基础知识编程能力(Python/Matlab),从事新能源、智能电网、交通电气化等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究大规模电动车接入对配电网负荷特性的影响;②设计有序充电策略以平抑负荷波动;③实现基于概率模拟的短期或长期负荷预测;④为电网规划、储能配置与需求响应提供数据支持技术方案。; 阅读建议:建议结合文中提供的代码实例,逐步运行并理解蒙特卡洛模拟的实现逻辑,重点关注输入参数的概率分布设定与多场景仿真的聚合方法,同时可扩展加入分时电价、用户行为偏好等实际约束条件以提升模型实用性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值