问题描述:将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并使奇数之间顺序反转,偶数之间顺序反转

示例:

交换前链表的顺序 交换后链表的顺序

4→5→7→1→6   ==>  1→7→5→6→4

1                ==>  1 (链表仅含一个元素)

2→1            ==>  1→2

==> (链表为空)

C/C++:

链表节点定义为:

struct node {

struct node *next;

int value;

};

struct node *swap(struct node *list);

Java:

链表节点定义为:

class Node {

public Node next;

public int value

}

Node swap(Node list)

注意点和要求如下:

1. swap函数要求对节点的指针/引用进行操作(不得创建任何新的链表节点)

2. 不得使用任何库函数/API,如需使用类似功能, 请自行实现

3. 不得将链表转化为其他类型数据结构再进行交换,如数组等

解题思路:具体思路是,将整个链表拆分为奇数链表和偶数链表两部分,然后把这两个子链表反转,最后把偶数链表接到奇数链表后面即可。具体java代码如下:


import java.util.*;class Node { // 链表节点的定义public int value;public Node next;}public class exam1 {public static Node create() { // 用来创建一个链表,用来测试的Node phead = new Node();Scanner scan = new Scanner(System.in);int n = scan.nextInt();phead.value = scan.nextInt();phead.next = null;Node p = phead;n--;while ((n--) > 0) {Node node = new Node();node.value = scan.nextInt();node.next = null;p.next = node;p = node;}return phead;}public static void print(Node phead) { // 打印链表,用来测试的while (phead != null) {System.out.print(phead.value + "->");phead = phead.next;}System.out.println();}public static Node swap(Node list) { // 按要求变换链表if(list==null)return list;Node p = list;Node pj = null;      //奇数链表头Node po = null;      //偶数链表头while (p != null) {     //寻找奇数和偶数链表头if (pj == null && p.value % 2 != 0)pj = p;if (po == null && p.value % 2 == 0)po = p;p = p.next;}if(po==null) return reverseList(pj);   //链表中没有偶数if(pj==null) return reverseList(po);   //链表中没有奇数p = list;Node p1 = pj, p2 = po;boolean f1=false,f2=false;     //f1用来标记链表中是否只有一个奇数节点,f2用来标记链表中是否只有一个偶数节点while (p != null) {           //拆分成奇数和偶数链表if ((p.value & 1) == 0) {if (p.value != po.value) {p2.next = p;p = p.next;p2 = p2.next;p2.next = null;f2=true;} elsep = p.next;} else {if (p.value != pj.value) {p1.next = p;p = p.next;p1 = p1.next;p1.next = null;f1=true;} elsep = p.next;}}if(!f1)pj.next=null;if(!f2)po.next=null;pj = reverseList(pj);  //分别反转奇数链表和偶数链表po = reverseList(po);p = pj;while (p.next != null) {     p = p.next;}p.next = po;   //将偶数链表接到奇数链表后面return pj;}public static Node reverseList(Node head) { // 反转链表Node pre = null;Node next = null;while (head != null) {next = head.next;head.next = pre;pre = head;head = next;}return pre;}public static void main(String[] args) {Node phead = create();print(phead);print(swap(phead));}
}

将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并使奇数之间顺序反转,偶数之间顺序反转(创新工厂涂鸦移动面试题)相关推荐

  1. 完全平方数和问题(创新工厂涂鸦移动面试题)

    问题描述:给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n.你需要让平方数的个数最少. 例如: 给出 n = 12, 返回 3 因为 12 = 4 + 4 ...

  2. java链表奇数倒序偶数顺序_将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变。...

    2.将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变. 示例: 交换前链表的顺序             交换后链表的顺序 4→5→3→1→2   == ...

  3. 【问题描述】在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素。【输入形式】循环输入若干个整数,以字母结束输入,建立带头结点的单链表。【输出形式】输出最

    [问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...

  4. java迭代器删除元素出异常_java迭代器移除元素出现并发修改异常的原因及解决...

    迭代器(Iterator的对象)主要用于遍历集合,体现的就是迭代器模式. Iterator接口定义了以下四种方法. boolean hasNext():如果集合还没遍历完就返回true. Object ...

  5. 数据结构初阶(4)(OJ练习【判断链表中是否有环、返回链表入口点、删除链表中的所有重复出现的元素】、双向链表LinkedList【注意事项、构造方法、常用方法、模拟实现、遍历方法、顺序表和链表的区别)

    接上次博客:数据结构初阶(3)(链表:链表的基本概念.链表的类型.单向不带头非循环链表的实现.链表的相关OJ练习.链表的优缺点 )_di-Dora的博客-CSDN博客 目录 OJ练习 双向链表--Li ...

  6. 在带头结点单链表中查找最大值,将其与最后一个元素交换(交换值)

    [问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...

  7. 无头结点单链表的逆置_从无头单链表中删除节点及单链表的逆置

    题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点).请将该节点从单链表中删除. 解答: 典型的"狸猫换太子", 若要删除该 ...

  8. 代码随想录Day01:数组理论基础、二分查找、移除元素

    目录 数组理论基础.二分查找.移除元素 1.数组理论基础 2.Leetcode704.二分查找 方法一 左闭右闭: 方法二 左闭右开: 方法三 左开右开: 方法四 左开右闭: 3.Leetcode27 ...

  9. 刻意练习:LeetCode实战 -- Task03. 移除元素

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

最新文章

  1. 在Red Hat Linux5下构建LAMP网站服务平台之MySQL、PHP的安装与配置
  2. crontab FAQ
  3. 免费Opengrok-代码阅读工具:Kernel,Optee,ATF,Uboot...
  4. 【Python基础】Python 流程控制专题总结
  5. 虚拟主机评测网已经崭露头角
  6. [NewLife.XCode]高级增删改
  7. React开发(243):dva概念7subscription
  8. RSA解密Matlab,RSA加密算法--matlab
  9. 扫荡波”来袭已造成大面积用户系统崩溃
  10. 在FL Studio中如何使用Patcher插件
  11. U盘拷贝者MBR勒索木马分析
  12. 南京审计学院计算机专业老师,南京审计学院如此对待一位好老师!!(转载)
  13. PAT Deepest Root
  14. 基于FPGA的数字混频器设计与仿真
  15. 数据库查询优化(转载)
  16. 从最新的技术趋势看前端的未来
  17. 安装pycrypto,windows10,全解
  18. 扫除模电障碍(一):基本放大电路和差模放大电路
  19. am5718_TI Cortex-A15 AM5718 AM57x 多核异构开发板免费试用
  20. oracle binary6,Oracle Binary Options 说明

热门文章

  1. 关注Parallels Desktop 10 for Mac破解版存在的危害
  2. discuz 自定义联盟推广链接案例及百度分享自定义推广链接的方法
  3. nms修改为soft nms
  4. h5课件制作_益阳H5课件制作团队
  5. 「津津乐道播客」#267 津津有味:冬天必须吃羊肉,没有为什么
  6. 华为gpon二层互通_干货 | 华为HCNA实战培训视频教程汇总集【共70集】,非常适合新入门的童鞋...
  7. linux 串口 lseek,lseek及llseek介绍
  8. Linux C : lseek函数
  9. 反射feign接口,调用feign的方法
  10. 景德镇陶瓷大学c语言考试试题,2021年景德镇陶瓷大学各专业考研真题复习资料汇总...