📜  排序已按绝对值排序的链表

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

排序已按绝对值排序的链表

给定一个基于绝对值排序的链表。根据实际值对列表进行排序。
例子:

Input :  1 -> -10 
output: -10 -> 1

Input : 1 -> -2 -> -3 -> 4 -> -5 
output: -5 -> -3 -> -2 -> 1 -> 4 

Input : -5 -> -10 
Output: -10 -> -5

Input : 5 -> 10 
output: 5 -> 10

来源:亚马逊专访

一个简单的解决方案是从头到尾遍历链表。对于每个访问过的节点,检查它是否乱序。如果是,请将其从当前位置移除并插入到正确位置。这是链表插入排序的实现,该方案的时间复杂度为O(n*n)。
更好的解决方案是使用归并排序对链表进行排序。该解决方案的时间复杂度为 O(n Log n)。
一个有效的解决方案可以在 O(n) 时间内工作。一个重要的观察结果是,所有负面元素都以相反的顺序存在。所以我们遍历链表,每当发现一个乱序的元素,就将它移到链表的最前面。
下面是上述想法的实现。

C++
// C++ program to sort a linked list, already
// sorted by absolute values
#include 
using namespace std;
 
// Linked List Node
struct Node
{
    Node* next;
    int data;
};
 
// Utility function to insert a node at the
// beginning
void push(Node** head, int data)
{
    Node* newNode = new Node;
    newNode->next = (*head);
    newNode->data = data;
    (*head) = newNode;
}
 
// Utility function to print a linked list
void printList(Node* head)
{
    while (head != NULL)
    {
        cout << head->data;
        if (head->next != NULL)
            cout << " -> ";
        head = head->next;
    }
    cout<next;
 
    // Traverse list
    while (curr != NULL)
    {
        // If curr is smaller than prev, then
        // it must be moved to head
        if (curr->data < prev->data)
        {
            // Detach curr from linked list
            prev->next = curr->next;
 
            // Move current node to beginning
            curr->next = (*head);
            (*head) = curr;
 
            // Update current
            curr = prev;
        }
 
        // Nothing to do if current element
        // is at right place
        else
            prev = curr;
 
        // Move current
        curr = curr->next;
    }
}
 
// Driver code
int main()
{
    Node* head = NULL;
    push(&head, -5);
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, -2);
    push(&head, 1);
    push(&head, 0);
 
    cout << "Original list :\n";
    printList(head);
 
    sortList(&head);
 
    cout << "\nSorted list :\n";
    printList(head);
 
    return 0;
}


Java
// Java program to sort a linked list, already
// sorted by absolute values
class SortList
{
    static Node head;  // head of list
   
    /* Linked list Node*/
    static class Node
    {
        int data;
        Node next;
        Node(int d) {data = d; next = null; }
    }
     
    // To sort a linked list by actual values.
        // The list is assumed to be sorted by absolute
        // values.
    Node sortedList(Node head)
    {
        // Initialize previous and current nodes
        Node prev = head;
        Node curr = head.next;
         
        // Traverse list
        while(curr != null)
        {
            // If curr is smaller than prev, then
                        // it must be moved to head
            if(curr.data < prev.data)
            {
                // Detach curr from linked list
                prev.next = curr.next;
                 
                // Move current node to beginning
                curr.next = head;
                head = curr;
                 
                // Update current
                curr = prev;
            }
             
            // Nothing to do if current element
                        // is at right place
            else
            prev = curr;
         
            // Move current
            curr = curr.next;
        }
        return head;
    }
     
    /* Inserts a new Node at front of the list. */
    public void push(int new_data)
    {
        /* 1 & 2: Allocate the Node &
                  Put in the data*/
        Node new_node = new Node(new_data);
   
        /* 3. Make next of new Node as head */
        new_node.next = head;
   
        /* 4. Move the head to point to new Node */
        head = new_node;
    }
     
    /* Function to print linked list */
    void printList(Node head)
    {
        Node temp = head;
        while (temp != null)
        {
           System.out.print(temp.data+" ");
           temp = temp.next;
        } 
        System.out.println();
    }
     
    /* Driver program to test above functions */
    public static void main(String args[])
    {
        SortList llist = new SortList();
          
        /* Constructed Linked List is 1->2->3->4->5->6->
           7->8->8->9->null */
        llist.push(-5);
        llist.push(5);
        llist.push(4);
        llist.push(3);
        llist.push(-2);
        llist.push(1);
        llist.push(0);
          
        System.out.println("Original List :");
        llist.printList(llist.head);
          
        llist.head = llist.sortedList(head);
  
        System.out.println("Sorted list :");
        llist.printList(llist.head);
    }
}
 
// This code has been contributed by Amit Khandelwal(Amit Khandelwal 1).


Python3
# Python3 program to sort a linked list,
# already sorted by absolute values
     
# Linked list Node
class Node:
    def __init__(self, d):
        self.data = d
        self.next = None
 
class SortList:
    def __init__(self):
        self.head = None
         
    # To sort a linked list by actual values.
    # The list is assumed to be sorted by
    # absolute values.
    def sortedList(self, head):
         
        # Initialize previous and
        # current nodes
        prev = self.head
        curr = self.head.next
         
        # Traverse list
        while(curr != None):
             
            # If curr is smaller than prev,
            # then it must be moved to head
            if(curr.data < prev.data):
                 
                # Detach curr from linked list
                prev.next = curr.next
                 
                # Move current node to beginning
                curr.next = self.head
                self.head = curr
                 
                # Update current
                curr = prev
             
            # Nothing to do if current element
            # is at right place
            else:
                prev = curr
         
            # Move current
            curr = curr.next
        return self.head
     
    # 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 = 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, head):
        temp = head
        while (temp != None):
            print(temp.data, end = " ")
            temp = temp.next
        print()
     
# Driver Code
llist = SortList()
 
# Constructed Linked List is 
# 1->2->3->4->5->6->7->8->8->9->null
llist.push(-5)
llist.push(5)
llist.push(4)
llist.push(3)
llist.push(-2)
llist.push(1)
llist.push(0)
         
print("Original List :")
llist.printList(llist.head)
         
start = llist.sortedList(llist.head)
 
print("Sorted list :")
llist.printList(start)
 
# This code is contributed by
# Prerna Saini


C#
// C# program to sort a linked list, already
// sorted by absolute values
using System;
 
public class SortList
{
    Node head; // head of list
     
    /* Linked list Node*/
    class Node
    {
        public int data;
        public Node next;
        public Node(int d)
        {
            data = d; next = null;
        }
    }
     
    // To sort a linked list by actual values.
    // The list is assumed to be sorted by absolute
    // values.
    Node sortedList(Node head)
    {
        // Initialize previous and current nodes
        Node prev = head;
        Node curr = head.next;
         
        // Traverse list
        while(curr != null)
        {
            // If curr is smaller than prev, then
            // it must be moved to head
            if(curr.data < prev.data)
            {
                // Detach curr from linked list
                prev.next = curr.next;
                 
                // Move current node to beginning
                curr.next = head;
                head = curr;
                 
                // Update current
                curr = prev;
            }
             
            // Nothing to do if current element
            // is at right place
            else
            prev = curr;
         
            // Move current
            curr = curr.next;
        }
        return head;
    }
     
    /* Inserts a new Node at front of the list. */
    public void push(int new_data)
    {
        /* 1 & 2: Allocate the Node &
                Put in the data*/
        Node new_node = new Node(new_data);
     
        /* 3. Make next of new Node as head */
        new_node.next = head;
     
        /* 4. Move the head to point to new Node */
        head = new_node;
    }
     
    /* Function to print linked list */
    void printList(Node head)
    {
        Node temp = head;
        while (temp != null)
        {
        Console.Write(temp.data + " ");
        temp = temp.next;
        }
        Console.WriteLine();
    }
     
    /* Driver code */
    public static void Main(String []args)
    {
        SortList llist = new SortList();
         
        /* Constructed Linked List is 1->2->3->
        4->5->6->7->8->8->9->null */
        llist.push(-5);
        llist.push(5);
        llist.push(4);
        llist.push(3);
        llist.push(-2);
        llist.push(1);
        llist.push(0);
         
        Console.WriteLine("Original List :");
        llist.printList(llist.head);
         
        llist.head = llist.sortedList(llist.head);
 
        Console.WriteLine("Sorted list :");
        llist.printList(llist.head);
    }
}
 
/* This code is contributed by 29AjayKumar */


Javascript


输出:

Original list :
0 -> 1 -> -2 -> 3 -> 4 -> 5 -> -5

Sorted list :
-5 -> -2 -> 0 -> 1 -> 3 -> 4 -> 5



如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程