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

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

用于对 0、1 和 2 的链表进行排序的Python程序

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

Input: 1 -> 1 -> 2 -> 0 -> 2 -> 0 -> 1 -> NULL
Output: 0 -> 0 -> 1 -> 1 -> 1 -> 2 -> 2 -> NULL

Input: 1 -> 1 -> 2 -> 1 -> 0 -> NULL 
Output: 0 -> 1 -> 1 -> 1 -> 2 -> NULL

来源:微软专访 |设置 1

以下步骤可用于对给定的链表进行排序。

  • 遍历列表,统计0、1、2的个数。设计数分别为 n1、n2 和 n3。
  • 再次遍历列表,前 n1 个节点用 0 填充,然后 n2 个节点用 1 填充,最后 n3 个节点用 2 填充。

下图是上述方法的试运行:

下面是上述方法的实现:

Python
# Python program to sort a linked list 
# of 0, 1 and 2
class LinkedList(object):
    def __init__(self):
  
         # Head of list
         self.head = None
  
    # Linked list Node
    class Node(object):
        def __init__(self, d):
            self.data = d
            self.next = None
  
    def sortList(self):
  
        # Initialise count of 0 1
        # and 2 as 0
        count = [0, 0, 0]
  
        ptr = self.head
  
        # Count total number of '0', '1' 
        # and '2'
        # count[0] will store total number 
        # of '0's
        # count[1] will store total number 
        # of '1's
        # count[2] will store total number   
        # of '2's  
        while ptr != None:
            count[ptr.data] += 1
            ptr = ptr.next
  
        i = 0
        ptr = self.head
  
        # Let say count[0] = n1, count[1] = n2 
        # and count[2] = n3
        # now start traversing list from head node,
        # 1) fill the list with 0, till n1 > 0
        # 2) fill the list with 1, till n2 > 0
        # 3) fill the list with 2, till n3 > 0  
        while ptr != None:
            if count[i] == 0:
                i+=1
            else:
                ptr.data = i
                count[i] -= 1
                ptr = ptr.next
  
  
    # Utility functions
    # Inserts a new Node at front of 
    # the list.
    def push(self, new_data):
  
        # 1 & 2: Allocate the Node &
        #        Put in the data
        new_node = self.Node(new_data)
  
        # 3. Make next of new Node as head
        new_node.next = self.head
  
        # 4. Move the head to point to new Node
        self.head = new_node
  
    # Function to print linked list
    def printList(self):
        temp = self.head
        while temp != None:
            print str(temp.data),
            temp = temp.next
        print ''
  
# Driver code
llist = LinkedList()
llist.push(0)
llist.push(1)
llist.push(0)
llist.push(2)
llist.push(1)
llist.push(1)
llist.push(2)
llist.push(1)
llist.push(2)
  
print "Linked List before sorting"
llist.printList()
  
llist.sortList()
  
print "Linked List after sorting"
llist.printList()
# This code is contributed by BHAVYA JAIN


输出:

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

时间复杂度: O(n),其中 n 是链表中的节点数。
辅助空间: O(1)

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