链表相关题目

一、反转单向链表

private static void reverseNode(Node head) {
    Node pre = null;
    Node currentNode = head;

    while (currentNode != null) {
        Node next = currentNode.next;
        currentNode.next = pre;
        pre = currentNode;
        currentNode = next;
    }

二、反转双向链表

private static void reverseNode(Node head) {
        Node currentNode = head;
        Node temp = null;
        while (currentNode != null) {
            temp = currentNode.next;
            currentNode.next = currentNode.pre;
            currentNode.pre = temp;
            currentNode = temp;

        }
    }

三、判断一个链表是否为回文结构

[题目]给定一个单链表的头节点head,请判断该链表是否为回文结返回true;

[例子] 1->2->1,返回true;

1->2->2->1,返回true;

15->6->15,返回true;

1->2->3,返回false。

[要求]如果链表长度为N,时间复杂度达到0(N),额外空间复杂度大到0(1)

3.1 使用 Stack来解决(空间复杂度 N)

/**
 * 使用栈来解决,空间复杂度是 N
 */
private static boolean checkhuiwen(Node head) {
    if (head == null) {
        return false;
    }
    Stack<Node> stack = new Stack<>();
    Node p1 = head;
    while (p1 != null) {
        stack.push(p1);
        p1 = p1.next;
    }

    Node p2 = head;
    while (!stack.isEmpty()) {
        if (stack.pop().value != p2.value) {
            return false;
        }
        p2 = p2.next;
    }
    return true;

}

3.2 使用快慢指针来解决(空间复杂度 1)

切成两边,然后从中间往两边进行比对,比对后,再给反转回来就行了~


/**
 * 使用指针来解决,空间复杂度是 1
 */
private static boolean checkhuiwen2(Node head) {
    if (head == null || head.next == null) {
        return true; // 空链表或者只有一个节点时,认为是回文结构
    }

    Node fastP = head;
    Node slowP = head;

    while (fastP.next != null && fastP.next.next != null) {
        slowP = slowP.next;
        fastP = fastP.next.next;
    }

    Node p1 = head;
    Node pre = null;
    Node next = null;
    while (true) {
        next = p1.next;
        p1.next = pre;
        if(p1 == slowP){
            break;
        }
        pre = p1;
        p1 = next;
    }

    Node pleft = slowP; // 前半部分反转后的头节点
    Node pRight = next;

    if(fastP.next == null){ // 链表长度奇数个
        pleft = pleft.next;
    }

    boolean flag = true;
    while (pleft != null && pRight != null) {
        if(pleft.value != pRight.value){
            flag = false;
            break;
        }
        pleft = pleft.next;
        pRight = pRight.next;
    }

    // 数组恢复原状
    head = reverseLink(slowP);
    slowP.next = next;

    return flag;
}

// <-1  2 -> 3 -> 4
public static Node reverseLink(Node head){
    Node pre = null;
    Node next = null;
    Node p1 = head;
    while(p1 != null){
        next = p1.next;
        p1.next = pre;
        pre = p1;
        p1 = next;
    }

    return pre; // 返回新的头结点
}

四、将单向链表切分左中右

将单向链表按某值划分成左边小、中间相等、右边大的形式

(其实跟快速排序有点像,但是快排的空间复杂度是 NlogN,时间复杂度是 NlogN,并且快排是不稳定的)

[题目] 给定一个单链表的头节点head,节点的值类型是整型,再给定一个整数pivot。

实现一个调整链表的函数,将链表调整为左部分都是值小于pivot的节点,中间部分都是值等于pivot的节点,右部分都是值大于pivot的节点。

[要求]稳定性

[要求] 时间复杂度请达到0(N),额外空间复杂度请达到0(1)

public static class Node {
    private int value;
    private int index;
    private Node next;

}

public static void main(String[] args) {
    Node aNode = new Node();
    aNode.index = 0;
    aNode.value = 1;

    Node bNode = new Node();
    bNode.index = 1;
    bNode.value = 3;

    Node cNode = new Node();
    cNode.index = 2;
    cNode.value = 1;

    Node dNode = new Node();
    dNode.index = 3;
    dNode.value = 5;

    Node eNode = new Node();
    eNode.index = 4;
    eNode.value = 2;

    Node fNode = new Node();
    fNode.index = 5;
    fNode.value = 10;

    Node gNode = new Node();
    gNode.index = 6;
    gNode.value = 2;

    Node hNode = new Node();
    hNode.index = 7;
    hNode.value = 3;

    aNode.next = bNode;
    bNode.next = cNode;
    cNode.next = dNode;
    dNode.next = eNode;
    eNode.next = fNode;
    fNode.next = gNode;
    gNode.next = hNode;
    splitPartition(aNode ,3);
}

private static void splitPartition(Node head,int target) {
    Node smallHead = null;
    Node smallEnd = null;

    Node equalsHead = null;
    Node equalsEnd = null;

    Node biggerHead = null;
    Node biggerEnd = null;

    Node p = head;
    while(p != null){
        if(p.value < target){
            if(null != smallEnd){
                smallEnd.next = p;
            }
            smallEnd = p;

            if(null == smallHead){
                smallHead = p;
            }
        }
        else if(p.value == target){
            if(null != equalsEnd){
                equalsEnd.next = p;
            }
            equalsEnd = p;
            if(null == equalsHead){
                equalsHead = p;
            }
        } else {
            if(null != biggerEnd){
                biggerEnd.next = p;
            }
            biggerEnd = p;
            if(null == biggerHead){
                biggerHead = p;
            }
        }
        p = p.next;
    }

    // 极端情况下, target 都比链表中的值小,那么 biggerHead 和 biggerEnd 都会指向 null
    if(null != biggerEnd){
        biggerEnd.next = null;
    }
    // 极端情况下, target 都比链表中的值大,那么 smallHead 和 smallEnd 都会指向 null
    if(null != smallEnd){
        smallEnd.next = equalsHead;
    }
    // 极端情况下, target 跟链表中对比,没有相等的,那么 equalsHead 和 equalsEnd 都会指向 null
    if(null != equalsEnd){
        equalsEnd.next = biggerHead;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/144943.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Live800:金牌客服常用的6大提问技巧

在客服行业&#xff0c;提问技巧是非常重要的一项技能。好的提问技巧不仅能够帮助客服人员更好地了解客户需求&#xff0c;还能够提高客户满意度和忠诚度。以下是金牌客服常用的6大提问技巧&#xff0c;希望能够对客服人员提升工作效率有所帮助。 1、开放性问题 开放性问题是指…

【Linux】Ubuntu16.04配置repo

Ubuntu16.04配置repo失败 在学习韦东山Linux嵌入式开发过程中&#xff0c;使用repo获取内核及工具链: git clone https://e.coding.net/codebug8/repo.gitmkdir -p 100ask_imx6ull-sdk && cd 100ask_imx6ull-sdk../repo/repo init -u https://gitee.com/weidongshan/…

腾讯云标准型S5服务器五年优惠价格表(4核8G和2核4G)

腾讯云服务器网整理五年云服务器优惠活动 txyfwq.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;…

3. 【自动驾驶和机器人中的SLAM技术】实现基于预积分和图优化的GNSS+IMU+Odom的融合定位系统

目录 1. 公式推导2. GNSSIMUOdom融合定位3. 利用数值求导工具&#xff0c;验证本书实验中的雅可比矩阵的正确性4. 也欢迎大家来我公众号读书--“过千帆” 1. 公式推导 2. GNSSIMUOdom融合定位 程序实现以及运行效果&#xff1a; ①首先是在预积分程序中记录了预积分积累的IMU数…

智安网络|探索语音识别技术:优势与挑战的全面解析

语音识别技术是人工智能领域的重要应用之一&#xff0c;它通过将语音信号转化为文本&#xff0c;实现了人机交互的一种新形式。随着科技的不断发展&#xff0c;语音识别技术在各个行业中得到了广泛的应用&#xff0c;但同时也存在着一些优势和劣势。 首先&#xff0c;语音识别…

环保气膜建筑的运维成本在哪几个方面

作为一种环保建筑&#xff0c;气膜结构在工业和文体领域得到了广泛认可。尽管气膜建筑在经济上具有明显的优势&#xff0c;但对于不了解它的人来说&#xff0c;他们可能会下意识地认为在运营和维护过程中会产生大量费用。今天&#xff0c;让我们一起了解一下气膜建筑在运营维护…

MHA实验

MHA: 什么是MHA masterhigh availabulity :基于主库的高可用环境下&#xff1a;主从复制&#xff0c;故障切换 主从的架构&#xff1a; MHA&#xff1a;最少要一主两从 mysql的单点故障问题&#xff0c;一旦主库崩溃&#xff0c;MHA可以在0-30秒内可以自动完成故障切换 M…

创作者焦点:Royal Flushed(第二章)

一起来看看「Dr. Bomkus 的试炼」幕后的创作故事吧&#xff5e; 「创作者焦点」系列报道将带来六篇关于「Dr. Bomkus 的试炼」游戏的创作过程&#xff0c;以及其独特的游戏玩法和功能。 屏住呼吸&#xff0c;潜入沉没区。穿过 Bomkus 设计的水下迷宫&#xff0c;回到地面上&…

为什么重写equals方法必须重写hashcode方法

在Java中&#xff0c;重写equals()方法的同时也应该重写hashCode()方法&#xff0c;这是因为这两个方法在 Java 中是有关联的&#xff0c;而且它们一起影响着集合类的行为。 Java中的hashCode()方法用于返回对象的哈希码&#xff0c;而equals()方法用于比较两个对象是否相等。…

Techgen ict 转 qrcTechFile问题整理

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 ERROR (EXTZTECH-157) : Density value need to increase monotonically . 根据提示定位到ict的以下内容: resistivity 0.231 106.5192 ... ... 1.9 81.3252 根据错误提示我…

中电金信:语言服务解决方案

​​ ​​ 点击或扫描下图二维码&#xff0c;查看更多相关内容 ​​ ​​ ​​ ​​ 01方案概述 我们以成熟的语言服务能力为核心&#xff0c;围绕出海企业的需求&#xff0c;构建覆盖企业出海全生命周期的语言服务。我们在全球31个城市设有交付中心&#xff0c;可以为出海…

MDM9205开发环境搭建与编译调试

前言 如题,这篇文章说的是高通mdm9205这颗物联网芯片,从官方资源的获取(包括文档、代码、软件工具等等)到如何编译出可运行固件的方法。 对经历了不止一次这颗芯片开发的我来说,在过程中遇到问题,除了寄希望于可能在工作日第二天凌晨得到的case回复,有一篇最新的有指导方…

Vue3中的 ref() 为何需要 .value ?

前言 本文是 Vue3 源码实战专栏的第 7 篇&#xff0c;从 0-1 实现 ref 功能函数。 官方文档 中对ref的定义&#xff0c; 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value。 老规矩还是从单测入手&…

Failed to restart network.service: Unit network.service not found.

执行systemctl restart network命令&#xff0c;报错Failed to restart network.service: Unit network.service not found. 执行 yum install network-scripts命令 再次执行&#xff0c;正常

计算机视觉基础(6)——光流估计

前言 本章我们来学习一下图像处理基础中的运动估计。主要内容包括运动场估计和光流估计两个部分。在运动场估计中&#xff0c;我们将学习到运动场、光流、光流和运动场的区别&#xff1b;在光流估计中&#xff0c;我们将学习到光流估计任务、孔径问题&#xff0c;以及光流估计两…

μC/OS-II---计时器管理1(os_tmr.c)

目录 创建一个计时器重新启动一个计时器停止一个计时器删除一个计时器 计时器是倒计时器&#xff0c;当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数&#xff0c;在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用&#xff08;…

腾讯云五年服务器CVM和三年轻量应用服务器选哪个?

腾讯云3年轻量和5年云服务器CVM优惠活动入口&#xff0c;3年轻量应用服务器配置可选2核2G4M和2核4G5M带宽&#xff0c;5年CVM云服务器可以选择2核4G和4核8G配置可选&#xff0c;阿腾云atengyun.com分享腾讯云3年轻量应用服务器和5年云服务器CVM优惠活动入口和配置报价&#xff…

【STM32单片机】比赛计时计分系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用OLED显示模块、矩阵按键模块、蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED默认显示第1节次比赛时间、AB得分。默认是12分钟倒计时…

机器学习6:逻辑回归

假设我们有一个二元分类问题&#xff0c;有两个特征&#xff08;x1, x2&#xff09;和对应的类别标签&#xff08;y&#xff09;。给定 以下训练数据集&#xff1a; 我们定义逻辑回归模型的假设函数和损失函数。假设函数使用 sigmoid 函 数来将线性函数的输出转换为概率值&…

Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】跳转Java之SpringCloud Alibaba【二】【微服务调用组件Feign】跳转Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】跳转Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】跳转Java之Sprin…
最新文章