题解 | #牛群的重新排列#

牛群的重新排列

https://www.nowcoder.com/practice/5183605e4ef147a5a1639ceedd447838

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 left int整型
     * @param right int整型
     * @return ListNode类
     */
    public ListNode reverseBetween (ListNode head, int left, int right) {
        if (head == null || left == right) return head;
        ListNode node = new ListNode(-1);
        node.next = head;
        ListNode pre = node;

        // 将指针移动到需要反转的起始位置的前一个节点
        for (int i = 1; i < left; i++) pre = pre.next;
        ListNode start = pre.next;
        ListNode then = start.next;

        // 循环反转链表节点
        for (int i = left; i < right; i++) {
            start.next = then.next;
            then.next = pre.next;
            pre.next = then;
            then = start.next;
        }

        return node.next;
    }
}

知识点:链表的反转

使用语言:java

思路:

创建一个虚拟节点node,并将node的next指向头节点head,以便处理边界情况和统一操作。

初始化一个指针pre指向node,将pre移动到需要反转的起始位置的前一个节点。

初始化一个指针start,将start指向pre的下一个节点,即需要反转的起始节点。

初始化一个指针then,将then指向start的下一个节点。

使用循环,执行反转操作。循环次数为(right - left)次。

每次循环中,先将start的next指向then的next,保留then的下一个节点用于下一次循环。

然后将then的next指向pre的next,完成节点反转。

最后将pre的next指向then,完成当前节点的反转。

循环结束后,将反转后的链表和剩余的部分连接起来。

返回node.next,即反转后的链表头节点。

优化后的代码运行效率更好,减少了不必要的指针移动操作,简化了代码逻辑。

时间复杂度为O(n),其中n为链表的长度。

全部评论

相关推荐

zhiyog:我见过有的国央企需要填高考总分,但是这么详细的第一次见,无敌了
点赞 评论 收藏
分享
不懂!!!:感觉你的项目描述太简单了,建议使用star描述法优化提炼一下,就是使用什么技术或方案解决了什么问题,有什么效果或成果,例如:对axios进行了二次封装,实现了请求的统一管理、错误的集中处理以及接口调用的简化,显著提高了开发效率和代码维护性,使用canvas技术实现了路线绘制功能,通过定义路径绘制函数和动态更新机制,满足了简化的导航可视化需求,提升了用户体验。像什么是使用其他组件库,基本功能描述就最好不要写到项目成果里面去了,加油
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务