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

题目

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值