📌  相关文章
📜  以波形形式对链表进行排序

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

以波形形式对链表进行排序

给定一个未排序的整数链表。任务是将 Linked List 排序为类似 Line 的 wave。如果排序后的列表为以下形式,则称链表以波形形式排序:

list[0] >= list[1] <= list[2] >= …..

其中 list[i] 表示链表第 i 个节点的数据。

例子

Input : List = 2 -> 4 -> 6 -> 8 -> 10 -> 20
Output : 4 -> 2 -> 8 -> 6 -> 20 -> 10

Input : List = 3 -> 6 -> 5 -> 10 -> 7 -> 20
Output : 6 -> 3 -> 10 -> 5 -> 20 -> 7

一个简单的解决方案是使用排序。首先对输入的链表进行排序,然后交换所有相邻元素。
例如,让输入列表为3 -> 6 -> 5 -> 10 -> 7 -> 20 。排序后,我们得到3 -> 5 -> 6 -> 7 -> 10 -> 20 。交换相邻元素后,我们得到5 -> 3 -> 7 -> 6 -> 20 -> 10这是所需的波形列表。

时间复杂度:O(N*logN),其中 N 是列表中的节点数。



有效的解决方案:这可以通过对给定列表进行一次遍历在 O(n) 时间内完成。这个想法是基于这样一个事实,如果我们确保所有偶数定位(在索引 0、2、4、..)元素都大于它们相邻的奇数元素,我们就不需要担心奇数定位的元素。以下是简单的步骤。

注意:假设列表中的索引从零开始。也就是说,list[0] 表示链表的第一个元素。

遍历输入链表的所有偶数定位元素,并执行以下操作。

  • 如果当前元素小于前一个奇数元素,则交换前一个和当前元素。
  • 如果当前元素小于下一个奇数元素,则交换下一个和当前元素。

下面是上述方法的实现:

C++
// C++ program to sort linked list
// in wave form
#include 
#include 
 
using namespace std;
 
// A linked list node
struct Node {
    int data;
    struct Node* 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;
}
 
// Function get size of the list
int listSize(struct Node* node)
{
    int c = 0;
 
    while (node != NULL) {
        c++;
 
        node = node->next;
    }
 
    return c;
}
 
// Function to print the list
void printList(struct Node* node)
{
    while (node != NULL) {
        cout << node->data << " ";
 
        node = node->next;
    }
}
 
/* UTILITY FUNCTIONS */
/* Function to swap two integers */
void swap(int* a, int* b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
 
// Function to sort linked list in
// wave form
void sortInWave(struct Node* head)
{
    struct Node* current = head;
    struct Node* prev = NULL;
 
    // Variable to track even position
    int i = 0;
 
    // Size of list
    int n = listSize(head);
 
    // Traverse all even positioned nodes
    while (i < n) {
 
        if (i % 2 == 0) {
            // If current even element is
            // smaller than previous
            if (i > 0 && (prev->data > current->data))
                swap(&(current->data), &(prev->data));
 
            // If current even element is
            // smaller than next
            if (i < n - 1 && (current->data < current->next->data))
                swap(&(current->data), &(current->next->data));
        }
 
        i++;
 
        prev = current;
        current = current->next;
    }
}
 
// Driver program to test above function
int main()
{
    struct Node* start = NULL;
 
    /* The constructed linked list is:
    10, 90, 49, 2, 1, 5, 23*/
    push(&start, 23);
    push(&start, 5);
    push(&start, 1);
    push(&start, 2);
    push(&start, 49);
    push(&start, 90);
    push(&start, 10);
 
    sortInWave(start);
 
    printList(start);
 
    return 0;
}


Java
// Java program to sort linked list
// in wave form
class GFG
{
     
// A linked list node
static class Node
{
    int data;
    Node next;
};
 
// Function to add a node at the
// beginning of Linked List
static Node 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;
    return head_ref;
}
 
// Function get size of the list
static int listSize( Node node)
{
    int c = 0;
    while (node != null)
    {
        c++;
        node = node.next;
    }
    return c;
}
 
// Function to print the list
static void printList( Node node)
{
    while (node != null)
    {
        System.out.print(node.data + " ");
        node = node.next;
    }
}
 
// Function to sort linked list in
// wave form
static Node sortInWave( Node head)
{
    Node current = head;
    Node prev = null;
 
    // Variable to track even position
    int i = 0;
 
    // Size of list
    int n = listSize(head);
 
    // Traverse all even positioned nodes
    while (i < n)
    {
        if (i % 2 == 0)
        {
            // If current even element is
            // smaller than previous
            if (i > 0 && (prev.data > current.data))
            {
                int t = prev.data;
                prev.data = current.data;
                current.data = t;
            }
                 
            // If current even element is
            // smaller than next
            if (i < n - 1 && (current.data <
                              current.next.data))
            {
                int t = current.next.data;
                current.next.data = current.data;
                current.data = t;
            }
        }
        i++;
 
        prev = current;
        current = current.next;
    }
    return head;
}
 
// Driver Code
public static void main(String args[])
{
    Node start = null;
 
    /* The constructed linked list is:
    10, 90, 49, 2, 1, 5, 23*/
    start = push(start, 23);
    start = push(start, 5);
    start = push(start, 1);
    start = push(start, 2);
    start = push(start, 49);
    start = push(start, 90);
    start = push(start, 10);
 
    start = sortInWave(start);
 
    printList(start);
}
}
 
// This code is contributed by Arnab Kundu


Python3
# Python3 program to sort linked list
# in wave form
  
# A linked list node
class Node:
     
    def __init__(self):
         
        self.data = 0
        self.next = None
 
# Function to add a node at the
# beginning of Linked List
def push( head_ref, new_data):
 
    ''' allocate node '''
    new_node = 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;
     
    return head_ref
  
# Function get size of the list
def listSize(node):
 
    c = 0;
  
    while (node != None):
        c += 1
  
        node = node.next;
  
    return c;
  
# Function to print the list
def printList(node):
 
    while (node != None):
         
        print(node.data, end = ' ')
  
        node = node.next;
  
# Function to sort linked list in
# wave form
def sortInWave(head):
 
    current = head;
    prev = None;
  
    # Variable to track even position
    i = 0;
  
    # Size of list
    n = listSize(head);
  
    # Traverse all even positioned nodes
    while (i < n):
  
        if (i % 2 == 0):
     
            # If current even element is
            # smaller than previous
            if (i > 0 and (prev.data > current.data)):
                (current.data), (prev.data) = (prev.data), (current.data)
  
            # If current even element is
            # smaller than next
            if (i < n - 1 and (current.data < current.next.data)):
                (current.data), (current.next.data) = (current.next.data), (current.data)
  
        i += 1
  
        prev = current;
        current = current.next;
      
# Driver program to test above function
if __name__=='__main__':
     
    start = None;
  
    ''' The constructed linked list is:
    10, 90, 49, 2, 1, 5, 23'''
    start = push(start, 23);
    start = push(start, 5);
    start = push(start, 1);
    start = push(start, 2);
    start = push(start, 49);
    start = push(start, 90);
    start = push(start, 10)
  
    sortInWave(start)
  
    printList(start);
  
# This code is contributed by pratham76


C#
// C# program to sort linked list
// in wave form
using System;
 
class GFG{
     
// A linked list node
class Node
{
    public int data;
    public Node next;
};
 
// Function to add a node at the
// beginning of Linked List
static Node 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;
    return head_ref;
}
 
// Function get size of the list
static int listSize( Node node)
{
    int c = 0;
     
    while (node != null)
    {
        c++;
        node = node.next;
    }
    return c;
}
 
// Function to print the list
static void printList( Node node)
{
    while (node != null)
    {
        Console.Write(node.data + " ");
        node = node.next;
    }
}
 
// Function to sort linked list in
// wave form
static Node sortInWave( Node head)
{
    Node current = head;
    Node prev = null;
 
    // Variable to track even position
    int i = 0;
 
    // Size of list
    int n = listSize(head);
 
    // Traverse all even positioned nodes
    while (i < n)
    {
        if (i % 2 == 0)
        {
             
            // If current even element is
            // smaller than previous
            if (i > 0 && (prev.data >
                          current.data))
            {
                int t = prev.data;
                prev.data = current.data;
                current.data = t;
            }
                 
            // If current even element is
            // smaller than next
            if (i < n - 1 && (current.data <
                              current.next.data))
            {
                int t = current.next.data;
                current.next.data = current.data;
                current.data = t;
            }
        }
        i++;
 
        prev = current;
        current = current.next;
    }
    return head;
}
 
// Driver Code
public static void Main(string []args)
{
    Node start = null;
 
    // The constructed linked list is:
    // 10, 90, 49, 2, 1, 5, 23
    start = push(start, 23);
    start = push(start, 5);
    start = push(start, 1);
    start = push(start, 2);
    start = push(start, 49);
    start = push(start, 90);
    start = push(start, 10);
 
    start = sortInWave(start);
 
    printList(start);
}
}
 
// This code is contributed by rutvik_56


Javascript


输出:
90 10 49 1 5 2 23

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