奇數結點升序偶數結點降序的單鏈表排序(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)  # 遍歷鏈表


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM