题目

一个链表,奇数结点升序,偶数结点降序,要求变成一个全升序的链表。

例如:1->8->2->7->3->6->4->5,变为1->2->3->4->5->6->7->8

解析

按照以下步骤处理:

按照奇偶位拆分为两个链表

反转偶数结点构成的链表

合并两个递增链表

Python实现

# -*- coding:utf-8 -*-

class Node(object):

def __init__(self, val=None, next=None):

self.val = val

self.next = next

def init_list(l):

"""创建不带头结点的单链表"""

head = Node()

tail = head

for val in l:

tail.next = Node(val)

tail = tail.next

tail.next = None

return head.next

def split_list(head):

"""按照奇偶位拆分为两个链表"""

head1 = head2 = None

cur1 = cur2 = None

count = 1

while head:

if count % 2 == 1:

if cur1:

cur1.next = head

cur1 = cur1.next

else:

cur1 = head1 = head

else:

if cur2:

cur2.next = head

cur2 = cur2.next

else:

cur2 = head2 = head

head = head.next

count += 1

cur1.next = None

cur2.next = None

return head1, head2

def reverse_list(head):

"""反转链表"""

if not head or not head.next:

return head

pre = next = None

while head:

next = head.next

head.next = pre

pre = head

head = next

return pre

def merge_list(head1, head2):

"""合并两个递增链表"""

head = Node() # 设置一个临时结点

tail = head

while head1 and head2:

if head1.val <= head2.val:

tail.next = head1

head1 = head1.next

else:

tail.next = head2

head2 = head2.next

tail = tail.next

# 合并剩余结点

if head1:

tail.next = head1

if head2:

tail.next = head2

return head.next

def visit_list(head):

while head:

print(head.val)

head = head.next

if __name__ == '__main__':

head = init_list([1, 8, 2, 7, 3, 6, 4, 5]) # 创建一个不带头结点的单链表:1->8->2->7->3->6->4->5

head1, head2 = split_list(head) # 1.按照奇偶位拆分为两个链表

head2 = reverse_list(head2) # 2.反转偶数结点构成的链表

head = merge_list(head1, head2) # 3.合并两个递增链表

visit_list(head) # 遍历链表

python选出奇数并降序_奇数结点升序偶数结点降序的单链表排序(Python实现)相关推荐

  1. python单链表排序_奇数结点升序偶数结点降序的单链表排序(Python实现)

    题目 一个链表,奇数结点升序,偶数结点降序,要求变成一个全升序的链表. 例如:1->8->2->7->3->6->4->5,变为1->2->3-& ...

  2. 奇数位升序偶数位降序链表排序

    题目描述:一个链表,奇数位升序偶数位降序,让链表变成升序的. 比如:1 8 3 6 5 4 7 2 9,最后输出1 2 3 4 5 6 7 8 9. 分析: 这道题可以分成三步: 首先根据奇数位和偶数 ...

  3. 奇数位升序偶数位降序的链表进行排序

    题目描述:一个链表,特点是奇数位升序偶数位降序,使得链表变成升序的. 分析 代码 节点类: main方法: 初始化方法: 按照奇偶位拆分成两个链表: 反转链表: 合并两个有序链表(非递归): 合并两个 ...

  4. python怎么反转单链表_单链表反转python实现代码示例

    单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: class Li ...

  5. C语言-实现对单循环链表中奇数和偶数结点的移动(前面奇数结点后面偶数结点)

    单循环链表是C语言中比较常见的一种链式储存结构. 相较于普通的单链表,其特点就在于单循环链表的尾指针指向的是头结点. 即: 1.单链表 2. 单循环链表的有点就在于方便访问第一个结点,还方便访问最后一 ...

  6. python 找到目录下文件名规则_假如编程是魔法之零基础看得懂的Python入门教程 ——(二)魔法实习生第一步了解魔杖的使用...

    学习目标 了解什么是开发环境 了解python语言的环境安装 了解python语言编程的编辑器工具 一.打怪升级你先得了解武器使用的条件 对于很多第一次学习编程的同学对于很多定义性的概念大多都不了解, ...

  7. python自带的对称算法_一种基于对称算法和专用加载模块的Python程序模块加密方法...

    一种基于对称算法和专用加载模块的Python程序模块加密方法 [专利说明]一种基于对称算法和专用加载模块的Python程序模块加密方法 技术领域 [0001]本发明涉及一种网络安全技术,具体涉及一种P ...

  8. 单链表的python实现

    首先说下线性表,线性表是一种最基本,最简单的数据结构,通俗点讲就是一维的存储数据的结构. 线性表分为顺序表和链接表: 顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存 ...

  9. 头插法(逆序)和尾插法(顺序)实现单链表的创建与排序

    链表是线性表的一种表示形式,和线性表的另一种表达形式--数组不同.在链表中,没有固定长度的设定,表中节点是彼此相连的,表中的每一个节点链接下一个节点(即后继),链表头(Head)指向链表的第一个节点. ...

最新文章

  1. Nat.Commun.|使用基于注意力机制的多标签神经网络预测并解释12种RNA修饰
  2. 谁动了我的内存之PHP内存溢出
  3. fullcalendar 显示的时间间隔只有四十五分钟_Linux命令行监控程序,还能实时高亮显示差异,我就选它了...
  4. 中小型互联网公司微服务实践-经验和教训
  5. python临床数据_从临床试验中获取数据
  6. [转载] 这100道练习,带你玩转Numpy
  7. matplotlib中ion()和ioff()的使用
  8. 雷赛服务器信号er020,伺服与雷赛控制卡配套的小技巧
  9. 电脑预览,电脑怎么预览psd格式?
  10. VMware Workstation12安装win 7企业版激活
  11. 码农造“神盘”:互联网人20年买房故事
  12. 北大先修课 计算机,北大先修课
  13. Javascript 面向对象编程(一):封装
  14. [转]我的世界观(一)
  15. 利用三轴加速器的计步测算方法
  16. AndroidIOS APP启动速度专项测试方法
  17. 买房应该全款还是贷款
  18. 上个月一位朋友买到翻新N80手机 淘宝充斥奸商假货 【该奸商为四钻】
  19. 青龙面板教程(五):代理设置
  20. Angular *NgFor - angular 基础教程

热门文章

  1. 推荐一款基于SpringBoot+Vue开发的分布式网盘系统(附源码)
  2. java面试题大合集(开发者必看二)
  3. 蓝桥杯-2的次幂表示(java)
  4. 帧布局(FrameLayout)及属性
  5. Java之进程与线程练习
  6. .sql文件如何执行_Excel如何运行可执行文件,别急,用过vba Shell函数的都知道
  7. (Oracle学习笔记) sql语言
  8. LeetCode 08字符串转整数09回文数
  9. layui上传报错会有哪些原因_数据丢失如何恢复?哪些原因会导致数据丢失
  10. 大数据架构详解_【数据如何驱动增长】(3)大数据背景下的数仓建设 amp; 数据分层架构设计...