📌  相关文章
📜  用于将仲裁指针指向链接列表中的最大值右侧节点的Python程序

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

用于将仲裁指针指向链接列表中的最大值右侧节点的Python程序

给定单链表,每个节点都有一个当前指向 NULL 的附加“任意”指针。我们需要将“任意”指针指向右侧链表中的最大值节点。

listwithArbit1

一个简单的解决方案是一个一个地遍历所有节点。对于每个节点,找到右侧具有最大值的节点并更改下一个指针。该解决方案的时间复杂度为 O(n 2 )。

一个有效的解决方案可以在 O(n) 时间内工作。以下是步骤。

  1. 反转给定的链表。
  2. 开始遍历链表,存储目前遇到的最大值节点。使每个节点的仲裁指向最大值。如果当前节点中的数据超过了迄今为止的max节点,则更新max。
  3. 反向修改链表并返回头部。

以下是上述步骤的实现。

Python
# Python Program to point arbit pointers 
# to highest value on its right
  
# Node class 
class Node: 
  
    # Constructor to initialize the 
    # node object 
    def __init__(self, data): 
        self.data = data 
        self.next = None
        self.arbit = None
  
# Function to reverse the linked list 
def reverse(head):
    prev = None
    current = head
    next = None
  
    while (current != None):    
        next = current.next
        current.next = prev
        prev = current
        current = next
      
    return prev
  
# This function populates arbit pointer 
# in every node to the greatest value 
# to its right.
def populateArbit(head):
  
    # Reverse given linked list
    head = reverse(head)
  
    # Initialize pointer to maximum 
    # value node
    max = head
  
    # Traverse the reversed list
    temp = head.next
    while (temp != None):
      
        # Connect max through arbit
        # pointer
        temp.arbit = max
  
        # Update max if required
        if (max.data < temp.data):
            max = temp
  
        # Move ahead in reversed list
        temp = temp.next
      
    # Reverse modified linked list and 
    # return head.
    return reverse(head)
  
# Utility function to print result 
# linked list
def printNextArbitPointers(node):
  
    print("Node    ", 
          "Next Pointer    " , 
          "Arbit Pointer")
    while (node != None):
      
        print(node.data , 
              "        ", 
              end = "")
  
        if (node.next != None):
            print(node.next.data , 
                  "        ", end = "")
        else :
            print("None" , 
                  "        ",end = "")
  
        if (node.arbit != None):
            print(node.arbit.data, end = "")
        else :
            print("None", end = "")
          
        print("")
        node = node.next
      
# Function to create a new node 
# with given data 
def newNode(data):
  
    new_node = Node(0)
    new_node.data = data
    new_node.next = None
    return new_node
  
# Driver code
head = newNode(5)
head.next = newNode(10)
head.next.next = newNode(2)
head.next.next.next = newNode(3)
head = populateArbit(head)
  
print("Resultant Linked List is: ")
printNextArbitPointers(head)
# This code is contributed by Arnab Kundu


Python3
# Python3 program to point arbit pointers
# to highest value on its right 
  
''' Link list node '''
# Node class 
class newNode: 
  
    # Constructor to initialize the 
    # node object 
    def __init__(self, data): 
        self.data = data 
        self.next = None
        self.arbit = None
  
# This function populates arbit pointer 
# in every node to the greatest value 
# to its right. 
maxNode = newNode(None)
def populateArbit(head):
      
    # using static maxNode to keep track 
    # of maximum orbit node address on 
    # right side 
    global maxNode
      
    # if head is null simply return the list 
    if (head == None):
        return
          
    ''' if head.next is null it means we 
        reached at the last node just update 
        the max and maxNode '''
    if (head.next == None):
        maxNode = head 
        return
          
    ''' Calling the populateArbit to the
        next node '''
    populateArbit(head.next) 
      
    ''' updating the arbit node of the 
        current node with the maximum 
        value on the right side '''
    head.arbit = maxNode 
      
    ''' if current Node value id greater 
        then the previous right node then 
        update it '''
    if (head.data > maxNode.data and 
        maxNode.data != None ):
        maxNode = head 
    return
  
# Utility function to prresult 
# linked list 
def printNextArbitPointers(node):
    print("Node    " , 
          "Next Pointer    " , 
          "Arbit Pointer")
    while (node != None):
        print(node.data, 
              "        ", 
              end = "")
        if(node.next):
            print(node.next.data,
                  "        ", 
                  end = "")
        else:
            print("NULL", "        ", 
                   end = "")
        if(node.arbit):
            print(node.arbit.data, end = "")
        else:
            print("NULL", end = "")
        print()
        node = node.next
          
# Driver code
head = newNode(5) 
head.next = newNode(10) 
head.next.next = newNode(2) 
head.next.next.next = newNode(3) 
populateArbit(head) 
print("Resultant Linked List is:") 
printNextArbitPointers(head) 
# This code is contributed by SHUBHAMSINGH10


输出:

Resultant Linked List is: 
Node    Next Pointer    Arbit Pointer
5               10              10
10              2               3
2               3               3
3               NULL            NULL

递归解决方案:
我们可以递归到达最后一个节点,从最后遍历链表。递归解决方案不需要反转链表。我们还可以使用堆栈代替递归来临时保存节点。感谢 Santosh Kumar Mishra 提供此解决方案。

Python3

# Python3 program to point arbit pointers
# to highest value on its right 
  
''' Link list node '''
# Node class 
class newNode: 
  
    # Constructor to initialize the 
    # node object 
    def __init__(self, data): 
        self.data = data 
        self.next = None
        self.arbit = None
  
# This function populates arbit pointer 
# in every node to the greatest value 
# to its right. 
maxNode = newNode(None)
def populateArbit(head):
      
    # using static maxNode to keep track 
    # of maximum orbit node address on 
    # right side 
    global maxNode
      
    # if head is null simply return the list 
    if (head == None):
        return
          
    ''' if head.next is null it means we 
        reached at the last node just update 
        the max and maxNode '''
    if (head.next == None):
        maxNode = head 
        return
          
    ''' Calling the populateArbit to the
        next node '''
    populateArbit(head.next) 
      
    ''' updating the arbit node of the 
        current node with the maximum 
        value on the right side '''
    head.arbit = maxNode 
      
    ''' if current Node value id greater 
        then the previous right node then 
        update it '''
    if (head.data > maxNode.data and 
        maxNode.data != None ):
        maxNode = head 
    return
  
# Utility function to prresult 
# linked list 
def printNextArbitPointers(node):
    print("Node    " , 
          "Next Pointer    " , 
          "Arbit Pointer")
    while (node != None):
        print(node.data, 
              "        ", 
              end = "")
        if(node.next):
            print(node.next.data,
                  "        ", 
                  end = "")
        else:
            print("NULL", "        ", 
                   end = "")
        if(node.arbit):
            print(node.arbit.data, end = "")
        else:
            print("NULL", end = "")
        print()
        node = node.next
          
# Driver code
head = newNode(5) 
head.next = newNode(10) 
head.next.next = newNode(2) 
head.next.next.next = newNode(3) 
populateArbit(head) 
print("Resultant Linked List is:") 
printNextArbitPointers(head) 
# This code is contributed by SHUBHAMSINGH10

输出:

Resultant Linked List is: 
Node    Next Pointer    Arbit Pointer
5               10              10
10              2               3
2               3               3
3               NULL            NULL

请参考完整文章 Point arbit pointer to maximum value right side node in alinked list 了解更多详情!