2020.11.13 奇偶链表

2023-11-19

2020.11.13 奇偶链表

题目描述

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

示例

示例一

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL

示例二

输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL

说明

应当保持奇数节点和偶数节点的相对顺序。
链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。

算法思路

因为考研的专业课时数据结构所以对于这种链表的操作还是比较熟悉的,这类链表问题主要时使用断链的方法,把奇数位的node组成一链,偶数位的node组成一链,然后在连起来。
起始时首先判断这个链表的状态,如果这个链表时空的或者只有1,2个node,那么这个链表时直接符合条件的,不需要调整直接输出就行。如果需要调整,则将node q指向第一个node,node p,p2指向第二位(p2主要时用于后续的链表的链接用),node r指向第三个node(用于拼接符合要求的节点),然后断开p,q的next,其大致状态如下图1。
图1
然后将奇数位的r接到q,偶数位的r接到p,直到r位空指针。

代码实现

public class Nov_13_oddEvenList {
    public ListNode oddEvenList(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }else{
        ListNode q = head;
        ListNode p = head.next;
        ListNode p2 = head.next;
        ListNode r = p.next;
            q.next= null;
            p.next = null;
            while (r != null) {
                if (r != null) {
                    q.next = r;
                    q = r;
                    r = r.next;
                    q.next = null;
                }
                if (r != null) {
                    p.next = r;
                    p = r;
                    r = r.next;
                    p.next = null;
                }
            }
            q.next = p2;
            return head;
        }
    }
    public static void main(String[] args) {
        ListNode listNode=new ListNode(1);
        ListNode head=listNode;
        for(int i=2;i<10;i++){
            ListNode newnode=new ListNode(i);
            listNode.next=newnode;
            listNode=newnode;
        }
        Nov_13_oddEvenList nov_13_oddEvenList=new Nov_13_oddEvenList();
        head=nov_13_oddEvenList.oddEvenList(head);
        while(head!=null){
            System.out.println(head.val);
            head=head.next;
        }

    }
}


class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

遇到的问题

这个算法的思想其实很简单,没有说明复杂的地方,我在做这个题目的过程中遇到的主要问题是这个head=null和head.next=null的情况没有考虑到。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020.11.13 奇偶链表 的相关文章

  • 医院管理系统服务器,解决方案-医院业务运维管理系统- 新华三集团-H3C

    BSM概述 H3C BSM 业务服务管理 解决方案 是新一代以业务为视角 以CMDB为核心 对业务和相关IT基础设施进行监控 管理和分析的解决方案 从业务入手 全面管理应用 网络 计算 存储 虚拟化等IT资源 建立统一的IT资源信息库 实现
  • 数据结构之数组

    目录 前言 线性表与连续内存 数组是如何支持随机访问 数组的插入与删除 数组越界 总结 参考文章 前言 数组是我们平时开发中经常遇到的一种数据结构 提起数组 我们能想到最大的特点就是 要提前定义好 需要提前申请好内存空间 数组是一种线性表数

随机推荐

  • 使用SVM对随机生成数据集进行分类 (线性可分 硬间隔)

    具体数学原理参考 统计学习方法 在学习过程中有疑惑如下 一直想不明白为什么式7 11中的分子没有用并且可以被当作常数 下面的解释是当w与b同比例变换时 函数间隔 即分子 亦会同比例变换 的确是这样 自己纸上写一下就好 但是为什么w和b一定要
  • 关于使用了中文用户名安装anaconda后jupyter报错问题解决 ---亲测有效

    win r 输入cmd后 弹出窗口里用户名是中文 有人会说 这个问题简单 直接改一下账户名即可 但这里只会使开机密码能改 dos窗口不会变 这样会导致一个问题 国外的某些软件 比如anaconda 要求启 动路径不能包含中文 必须是全英文
  • 第一天 复旦微FM33G048简单入门学习

    1 复旦微FM33G048基本参数 内容 参数 宽电压范围 1 8 5 5V 处理器内核 ARM Cortex M0 最高40MHz主频 SWD调试接口 支持用户 特权模式 支持中断向量表重定向 VTOR 低功耗技术平台 典型运行功耗180
  • 【零基础玩转BLDC系列】基于反电动势过零检测法的无刷直流电机控制原理

    无刷直流电动机基本转动原理请参考 基于HALL传感器的无刷直流电机控制原理 基本原理及基础知识本篇不再赘述 目录 反电势过零检测法的原理 反电势过零检测实现方法 位置传感器的存在限制了无刷直流电机在某些特定场合中的应用 如 使电机系统的体积
  • 试题库管理系统--数据库设计

    链接 https pan baidu com s 1ilMGCA n1GPDk3O8k7w7Gg 提取码 m0ke 复制这段内容后打开百度网盘手机App 操作更方便哦 一 概要设计 1 1 背景和意义 目前 许多高校绝大多数课程还采用考教统
  • Spring(二)控制反转

    控制反转是Spring框架的核心 用来消减计算机程序的耦合问题 依赖注入是IoC的另一种方法 只是从不同的角度上来描述的 通过 面向对象思想讨论控制反转和依赖注入两个概念 当某个java对象 调用者 需要调用另一个Java对象 被调用者 即
  • 声笔飞码6.00版使用指南

    声笔飞码6 00版使用指南 声笔飞码发明人兼设计人 戴石麟 电邮 sbxlm 126 com 一 声笔飞码6 00简介 声笔飞码在声笔码的基础上增加了偏旁部首对中文字词进行编码 用一个字母 通常取汉字读音的声母 有时也对偏旁部首进行形托 来
  • 7-1 两个有序链表序列的合并(编程题)

    已知两个非降序链表序列S1与S2 设计函数构造出S1与S2合并后的新的非降序链表S3 输入格式 输入分两行 分别在每行给出由若干个正整数构成的非降序序列 用 1表示序列的结尾 1不属于这个序列 数字用空格间隔 输出格式 在一行中输出合并后新
  • 完美数

    按照毕达哥拉斯的说法 数的完满取决于它的真因数 即除了自身以外的约数 例如 12的因数是 1 2 3 4 和 6 当一个数的各因数之和大于该数本身时 该数称为 盈 数 于是 12 是一个盈数 因为它的因数加起来等于 16 另一方面 当一个数
  • Linux Touch命令的8种使用技巧

    Linux touch命令不仅可以用于在Linux上创建空文件 您可以使用它来更改现有文件的时间戳 包括其访问权限和修改时间 本文介绍了8种可以通过Linux终端使用touch命令的方案 我们在Ubuntu 18 04 LTS Ubuntu
  • Stable Diffusion背后原理(Latent Diffusion Models)

    前言 2023年第一篇博客 大家新年好呀 这次来关注一下Stable Diffusion背后的原理 即 High Resolution Image Synthesis with Latent Diffusion Models 这篇论文 之前
  • Vc/MFC中自定义消息及其PostMessage触发使用

    http blog csdn net ztz0223 article details 2058402 http blog csdn net a8082649 article details 7733527 http bbs csdn net
  • chatgpt赋能python:Python写一个抽奖程序:从随机数生成到实现

    Python写一个抽奖程序 从随机数生成到实现 Python是当今最热门的编程语言之一 无论是开发网站 进行数据分析 实现机器学习 还是进行游戏开发 Python都可以胜任 在本文中 我们将介绍如何使用Python编写一个简单的抽奖程序 程
  • 文件上传 华为云服务器,文件上传云服务器

    文件上传云服务器 内容精选 换一换 HPC是高性能计算 High Performance Computing 的简称 通常指以计算为目的 使用了很多处理器的单个计算机系统或者使用了多台计算机集群的计算机系统和环境 能够执行一般个人电脑无法处
  • djangorestframework 序列化

    djangorestframework 序列化 序列化常用字段参数 1 选项参数 name serializers CharField min length 3 max length 20 max length 最大长度 min lengh
  • Matplotlib画条形图和柱形图并添加数据标注

    这里放上我比较喜欢的一种条形图设置 使用的是之前爬取的重庆地区链家二手房数据 数据如下 链接 https pan baidu com s 17CMwUAdseO8tJWHEQiA8 A 提取码 dl2g import pandas as p
  • java list stream 去除 null_Stream流的这些操作,你得知道,对你工作有很大帮助

    Stream流 Stream 流 是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象 形成一个队列 Java中的Stream并不会存储元素 而 是按需计算 数据源 流的来源 可以是集合 数组等 聚合操作类似SQL语句一样的操作
  • 信号和槽

    1 信号和槽是一种高级接口 应用于对象之间的通信 它是QT的核心特性 也是QT区别于其它工具包的重要地方 信号和槽是QT自行定义的一种通信机制 2 moc Meta ObjectCompiler QT工具 该工具是一个C 预处理程序 它为高
  • Charles 安装及配置,详细步骤

    一 安装激活 1 1 下载 https www charlesproxy com download 1 2 激活 打开Charles gt Help gt Register Charles gt 输入 Registered Name htt
  • 2020.11.13 奇偶链表

    2020 11 13 奇偶链表 题目描述 给定一个单链表 把所有的奇数节点和偶数节点分别排在一起 请注意 这里的奇数节点和偶数节点指的是节点编号的奇偶性 而不是节点的值的奇偶性 请尝试使用原地算法完成 你的算法的空间复杂度应为 O 1 时间