📌  相关文章
📜  用于通过更改链接对 0、1 和 2 的链表进行排序的Python程序

📅  最后修改于: 2022-05-13 01:56:09.957000             🧑  作者: Mango

用于通过更改链接对 0、1 和 2 的链表进行排序的Python程序

给定一个由 0、1 和 2 组成的链表,对它进行排序。
例子:

Input: 2->1->2->1->1->2->0->1->0
Output: 0->0->1->1->1->1->2->2->2
The sorted Array is 0, 0, 1, 1, 1, 1, 2, 2, 2.

Input: 2->1->0
Output: 0->1->2
The sorted Array is 0, 1, 2

方法 1:在下面的帖子中讨论了一个通过更改节点数据来工作的解决方案。
对 0s、1s 和 2s 的链表进行排序
当这些值具有与之关联的数据时,上述解决方案不起作用。
例如,这三个代表三种颜色以及与颜色相关的不同类型的对象,并根据颜色对对象进行排序(通过链表连接)。

方法 2:在这篇文章中,讨论了一种通过更改链接来工作的新解决方案。
方法:遍历链表。维护 3 个名为 0、1 和 2 的指针,分别指向包含 0、1 和 2 的链表的当前结束节点。对于每个遍历的节点,我们将其附加到其相应列表的末尾。最后,我们链接所有三个列表。为了避免许多空检查,我们使用了三个虚拟指针 zeroD、oneD 和 twoD,它们作为三个列表的虚拟标题。

Python3
# Python3 Program to sort a linked list
# 0s, 1s or 2s by changing links
import math
 
# Link list node
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
 
#Node* newNode( data)
 
# Sort a linked list of 0s, 1s
# and 2s by changing pointers.
def sortList(head):
    if (head == None or
        head.next == None):
        return head
 
    # Create three dummy nodes to point
    # to beginning of three linked lists.
    # These dummy nodes are created to
    # avoid many None checks.
    zeroD = Node(0)
    oneD = Node(0)
    twoD = Node(0)
 
    # Initialize current pointers for
    # three lists and whole list.
    zero = zeroD
    one = oneD
    two = twoD
 
    # Traverse list
    curr = head
    while (curr):
        if (curr.data == 0):
            zero.next = curr
            zero = zero.next
            curr = curr.next
        elif(curr.data == 1):
            one.next = curr
            one = one.next
            curr = curr.next
        else:
            two.next = curr
            two = two.next
            curr = curr.next
         
    # Attach three lists
    zero.next = (oneD.next) if (oneD.next)
                            else (twoD.next)
    one.next = twoD.next
    two.next = None
 
    # Updated head
    head = zeroD.next
 
    # Delete dummy nodes
    return head
 
# Function to create and return
# a node
def newNode(data):
     
    # Allocating space
    newNode = Node(data)
 
    # Inserting the required data
    newNode.data = data
    newNode.next = None
    return newNode
 
# Function to print linked list
def prList(node):
    while (node != None):
        print(node.data, end = " ")
        node = node.next
     
# Driver Code
if __name__=='__main__':
     
    # Creating the list 1.2.4.5
    head = newNode(1)
    head.next = newNode(2)
    head.next.next = newNode(0)
    head.next.next.next = newNode(1)
 
    print("Linked List Before Sorting")
    prList(head)
 
    head = sortList(head)
 
    print("Linked List After Sorting")
    prList(head)
# This code is contributed by Srathore


输出 :

Linked List Before Sorting
1  2  0  1  
Linked List After Sorting
0  1  1  2  

复杂性分析:

  • 时间复杂度: O(n),其中 n 是链表中的节点数。
    只需要遍历一次链表。
  • 辅助空间: O(1)。
    因为不需要额外的空间。

请参阅完整文章通过更改链接对 0、1 和 2 的链表进行排序以获取更多详细信息!