📜  排序包含从1到N的值的链接列表

📅  最后修改于: 2021-04-26 05:55:26             🧑  作者: Mango

给定大小为N的链接列表,其中包含从1到N的所有值。任务是按递增顺序对链接列表进行排序。

例子:

Input : List = 3 -> 5 -> 4 -> 6 -> 1 -> 2
Output : 1 -> 2 -> 3 -> 4 -> 5 -> 6

Input : List = 5 -> 4 -> 3 -> 2 -> 1
Output : 1 -> 2 -> 3 -> 4 -> 5

天真的方法:最简单的方法是使用任何类型的排序方法来对链接列表进行排序。最少需要O(N * logN)个时间。

高效的方法:一种有效的方法是观察链表包含总共N个元素,并且元素从1到N进行编号。遍历链表并用其位置替换每个元素。

以下是此方法的实现:

C++
// C++ program to sort linked list containing
// values from 1 to N
#include 
  
using namespace std;
  
// A linked list node
struct Node {
    int data;
    struct Node* next;
};
  
// Function to sort linked list
bool sortList(struct Node* head)
{
    int startVal = 1;
  
    while (head != NULL) {
        head->data = startVal;
  
        startVal++;
  
        head = head->next;
    }
}
  
// Function to add a node at the
// beginning of Linked List
void push(struct Node** head_ref, int new_data)
{
    /* allocate node */
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
  
    /* put in the data */
    new_node->data = new_data;
  
    /* link the old list off the new node */
    new_node->next = (*head_ref);
  
    /* move the head to point to the new node */
    (*head_ref) = new_node;
}
  
// This function prints contents of
// linked list starting from
// the given node
void printList(struct Node* node)
{
    while (node != NULL) {
        cout << node->data << " ";
  
        node = node->next;
    }
}
  
// Driver program to test above function
int main()
{
    struct Node* start = NULL;
  
    /* The constructed linked list is: 
    3->5->4->6->1->2 */
    push(&start, 2);
    push(&start, 1);
    push(&start, 6);
    push(&start, 4);
    push(&start, 5);
    push(&start, 3);
  
    sortList(start);
  
    printList(start);
  
    return 0;
}


Java
// Java program to sort linked list containing
// values from 1 to N
import java.util.*;
class GFG 
{
  
/* Link list node */
static class Node
{
    int data;
    Node next;
};
static Node start;
  
// Function to sort linked list
static void sortList(Node head)
{
    int startVal = 1;
  
    while (head != null)
    {
        head.data = startVal;
  
        startVal++;
  
        head = head.next;
    }
}
  
// Function to add a node at the
// beginning of Linked List
static void push(Node head_ref, 
                 int new_data)
{
    /* allocate node */
    Node new_node = new Node();
  
    /* put in the data */
    new_node.data = new_data;
  
    /* link the old list off the new node */
    new_node.next = head_ref;
  
    /* move the head to point to the new node */
    head_ref = new_node;
    start = head_ref;
}
  
// This function prints contents of
// linked list starting from
// the given node
static void printList(Node node)
{
    while (node != null)
    {
        System.out.print(node.data + " ");
  
        node = node.next;
    }
}
  
// Driver Code
public static void main(String[] args) 
{
    start = null;
  
    /* The constructed linked list is: 
    3->5->4->6->1->2 */
    push(start, 2);
    push(start, 1);
    push(start, 6);
    push(start, 4);
    push(start, 5);
    push(start, 3);
  
    sortList(start);
  
    printList(start);
}
}
  
// This code is contributed by PrinciRaj1992


Python3
# Python3 program to sort linked list 
# containing values from 1 to N
import math
  
# A linked list node
class Node: 
    def __init__(self, data): 
        self.data = data 
        self.next = None
  
# Function to sort linked list
def sortList(head):
    startVal = 1
  
    while (head != None):
        head.data = startVal
  
        startVal = startVal + 1
  
        head = head.next
      
# Function to add a node at the
# beginning of Linked List
def push(head_ref, new_data):
      
    # allocate node 
    new_node = Node(new_data)
  
    # put in the data 
    new_node.data = new_data
  
    # link the old list off the new node 
    new_node.next = head_ref
  
    # move the head to po to the new node 
    head_ref = new_node
    return head_ref
  
# This function prs contents of
# linked list starting from
# the given node
def prList(node):
    while (node != None):
        print(node.data, end = " ")
  
        node = node.next
      
# Driver Code
if __name__=='__main__':
    head = None
  
    # The constructed linked list is: 
    #3.5.4.6.1.2 
    head = push(head, 2)
    head = push(head, 1)
    head = push(head, 6)
    head = push(head, 4)
    head = push(head, 5)
    head = push(head, 3)
  
    sortList(head)
  
    prList(head)
  
# This code is contributed by Srathore


C#
// C# program to sort linked list 
// containing values from 1 to N
using System;
      
class GFG 
{
  
/* Link list node */
public class Node
{
    public int data;
    public Node next;
};
static Node start;
  
// Function to sort linked list
static void sortList(Node head)
{
    int startVal = 1;
  
    while (head != null)
    {
        head.data = startVal;
  
        startVal++;
  
        head = head.next;
    }
}
  
// Function to add a node at the
// beginning of Linked List
static void push(Node head_ref, 
                 int new_data)
{
    /* allocate node */
    Node new_node = new Node();
  
    /* put in the data */
    new_node.data = new_data;
  
    /* link the old list 
     off the new node */
    new_node.next = head_ref;
  
    /* move the head to point 
       to the new node */
    head_ref = new_node;
    start = head_ref;
}
  
// This function prints contents of
// linked list starting from
// the given node
static void printList(Node node)
{
    while (node != null)
    {
        Console.Write(node.data + " ");
  
        node = node.next;
    }
}
  
// Driver Code
public static void Main(String[] args) 
{
    start = null;
  
    /* The constructed linked list is: 
    3->5->4->6->1->2 */
    push(start, 2);
    push(start, 1);
    push(start, 6);
    push(start, 4);
    push(start, 5);
    push(start, 3);
  
    sortList(start);
  
    printList(start);
}
}
  
// This code is contributed 
// by Princi Singh


输出:
1 2 3 4 5 6