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

题目

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

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

解析

按照以下步骤处理:

  1. 按照奇偶位拆分为两个链表
  2. 反转偶数结点构成的链表
  3. 合并两个递增链表

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)  # 遍历链表

原文地址:https://www.cnblogs.com/terry-c/p/9866083.html

时间: 2024-10-09 10:26:54

奇数结点升序偶数结点降序的单链表排序(Python实现)的相关文章

使用TreeSet和Comparator,写TreeSetTest2 要求:对TreeSet中的元素1,2,3,4,5,6,7,8,9,10进行排列,排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列

/* * 使用TreeSet和Comparator,写TreeSetTest2 *要求:对TreeSet中的元素1,2,3,4,5,6,7,8,9,10进行排列, *排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列 */ import java.util.Comparator; import java.util.TreeSet; public class TreeTest2 { public static void main(String[] args) { // TODO Aut

【LeetCode-面试算法经典-Java实现】【021-Merge Two Sorted Lists(合并两个排好序的单链表)】

[021-Merge Two Sorted Lists(合并两个排好序的单链表)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 题目大意 合并两个排序链表并返回一个新的列表.新的链表的

正序逆序生成单链表

typedef struct LNode{ int key; struct LNode *next; }LNode,*List; //正序生成单链表 void CreateList1(List &L,int n){ L=(List)malloc(sizeof(LNode)); L->next=NULL; LNode *q=L; for(int i=1;i<=n;i++) { LNode *p=(LNode *)malloc(sizeof(LNode)); scanf("%d&

升序堆和降序堆(优先队列) 洛谷1801

1 // 洛谷1801 2 // 一个升序堆,一个降序堆 3 // 降序堆维护序列的前i个最小值 4 // 插如元素的时候,如果x小于降序堆最大值,则替换,并将最大值插入升序堆:否则,直接插入升序堆 5 // 每次输出升序堆的最小值即可 6 7 8 #include <bits/stdc++.h> 9 using namespace std; 10 #define LL long long 11 typedef pair<int,int> pii; 12 const int inf

java一段数字 分割的升序降序 奇偶数分开排序

/** * 降序升序 * * @param str * @since 0.0.1 */ public void sort(String str){ String[] nums = str.split(" "); List<Integer> odd = new ArrayList<Integer>(); List<Integer> even = new ArrayList<Integer>(); for (String string : n

Mysql——实现按字段部分升序,部分降序的方法

mysql order排序时可以通过asc参数实现升序,desc参数实现降序. 例如: 升序排序:select   *  from  表名 order by  字段 asc  (mysql默认是升序排列) 降序排序:select   *  from  表名 order by  字段 desc 如果希望查询结果,对一个字段进行升序,一个进行降序,则可以通过以下方式实现: order by "升序字段" asc,"降序字段" desc. 我自己做测试的话,应该是先排序一

2015华为机试—— 输入整型数组和排序标识,对其元素按照升序或降序进行排序

接口说明 原型: void sortIntegerArray(Integer[] pIntegerArray, int iSortFlag); 输入参数: Integer[] pIntegerArray:整型数组 int  iSortFlag:排序标识:0表示按升序,1表示按降序 输出参数: 无 返回值: void 这题比较简单,也没什么思路好说,直接看代码 代码如下: public final class Demo { // 功能:输入整型数组,对其元素按照升序或降序进行排序 // 输入:pI

mysql中一个字段升序,另一个字段降序

mySql中,升序为asc,降序为desc.例如: 升序:select   *  from  表名 order by  表中的字段 asc(mysql中默认是升序排列,可不写) 降序:select   *  from  表名 order by  表中的字段 desc 若要进行同时一个升序,一个降序,则如下: order by 升序字段 asc,降序字段 desc. 原文地址:https://www.cnblogs.com/LYliangying/p/9576488.html

MySQL 8 新特性之信用盘源码搭建出售降序索引实现

什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: 信用盘源码搭建出售q-1152880099 create index idx_t1_bcd on t1(b,c,d); 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引. 但是大家不知道的是,上面这个sql实际上和下面的这个sql是等价的: create index idx_t1_bcd on t1(b asc,c asc,d asc); asc