📌  相关文章
📜  删除右侧值较大的节点

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

删除右侧值较大的节点

给定一个单向链表,删除右侧所有具有较大值的节点。

例子:
a)列表 12->15->10->11->5->6->2->3->NULL 应更改为 15->11->6->3->NULL。注意12、10、5、2已经被删掉了,因为右边有更大的值。
当我们检查12时,我们看到12之后有一个值大于12(即15)的节点,所以我们删除12。
当我们检查 15 时,我们发现 15 之后没有节点的值大于 15,所以我们保留这个节点。
当我们这样做时,我们得到 15->6->3
b)列表 10->20->30->40->50->60->NULL 应更改为 60->NULL。请注意,10、20、30、40 和 50 已被删除,因为它们在右侧都有更大的值。
c)列表 60->50->40->30->20->10->NULL 不应更改。

方法一(简单)
使用两个循环。在外循环中,一一选取链表的节点。在内部循环中,检查是否存在值大于选取的节点的节点。如果存在值更大的节点,则删除选取的节点。
时间复杂度: O(n^2)

方法二(反向使用)
感谢 Paras 提供以下算法。
1. 反转列表。
2. 遍历反向列表。保持最大到现在。如果下一个节点小于max,则删除下一个节点,否则max=下一个节点。
3. 再次反转列表以保留原始顺序。
时间复杂度: O(n)
感谢 R.Srinivasan 提供以下代码。

C++
// C++ program to delete nodes
// which have a greater value on
// right side
#include 
using namespace std;
 
/* structure of a linked list node */
struct Node
{
    int data;
    struct Node* next;
};
 
/* prototype for utility functions */
void reverseList(struct Node** headref);
void _delLesserNodes(struct Node* head);
 
/* Deletes nodes which have a node with
greater value node on left side */
void delLesserNodes(struct Node** head_ref)
{
    /* 1) Reverse the linked list */
    reverseList(head_ref);
 
    /* 2) In the reversed list, delete nodes
    which have a node with greater value node
    on left side. Note that head node is never
    deleted because it is the leftmost node.*/
    _delLesserNodes(*head_ref);
 
    /* 3) Reverse the linked list again to
    retain the original order */
    reverseList(head_ref);
}
 
/* Deletes nodes which have
greater value node(s) on left side */
void _delLesserNodes(struct Node* head)
{
    struct Node* current = head;
 
    /* Initialize max */
    struct Node* maxnode = head;
    struct Node* temp;
 
    while (current != NULL &&
           current->next != NULL)
    {
        /* If current is smaller than max,
        then delete current */
        if (current->next->data < maxnode->data)
        {
            temp = current->next;
            current->next = temp->next;
            free(temp);
        }
 
        /* If current is greater than max,
            then update max and move current */
        else
        {
            current = current->next;
            maxnode = current;
        }
    }
}
 
/* Utility function to insert a node
at the beginning */
void push(struct Node** head_ref, int new_data)
{
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = new_data;
    new_node->next = *head_ref;
    *head_ref = new_node;
}
 
/* Utility function to reverse a linked list */
void reverseList(struct Node** headref)
{
    struct Node* current = *headref;
    struct Node* prev = NULL;
    struct Node* next;
    while (current != NULL)
    {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
    *headref = prev;
}
 
/* Utility function to print a linked list */
void printList(struct Node* head)
{
    while (head != NULL)
    {
        cout << " " << head->data ;
        head = head->next;
    }
    cout << "\n" ;
}
 
/* Driver program to test above functions */
int main()
{
    struct Node* head = NULL;
 
    /* Create following linked list
    12->15->10->11->5->6->2->3 */
    push(&head, 3);
    push(&head, 2);
    push(&head, 6);
    push(&head, 5);
    push(&head, 11);
    push(&head, 10);
    push(&head, 15);
    push(&head, 12);
 
    cout << "Given Linked List \n" ;
    printList(head);
 
    delLesserNodes(&head);
 
    cout << "Modified Linked List \n" ;
    printList(head);
 
    return 0;
}
 
// This code is contributed by shivanisinghss2110


C
// C program to delete nodes which have a greater value on
// right side
#include 
#include 
 
/* structure of a linked list node */
struct Node {
    int data;
    struct Node* next;
};
 
/* prototype for utility functions */
void reverseList(struct Node** headref);
void _delLesserNodes(struct Node* head);
 
/* Deletes nodes which have a node with greater value node
  on left side */
void delLesserNodes(struct Node** head_ref)
{
    /* 1) Reverse the linked list */
    reverseList(head_ref);
 
    /* 2) In the reversed list, delete nodes which have a node
       with greater value node on left side. Note that head
       node is never deleted because it is the leftmost node.*/
    _delLesserNodes(*head_ref);
 
    /* 3) Reverse the linked list again to retain the
       original order */
    reverseList(head_ref);
}
 
/* Deletes nodes which have greater value node(s) on left side */
void _delLesserNodes(struct Node* head)
{
    struct Node* current = head;
 
    /* Initialize max */
    struct Node* maxnode = head;
    struct Node* temp;
 
    while (current != NULL && current->next != NULL) {
        /* If current is smaller than max, then delete current */
        if (current->next->data < maxnode->data) {
            temp = current->next;
            current->next = temp->next;
            free(temp);
        }
 
        /* If current is greater than max, then update max and
            move current */
        else {
            current = current->next;
            maxnode = current;
        }
    }
}
 
/* Utility function to insert a node at the beginning */
void push(struct Node** head_ref, int new_data)
{
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = new_data;
    new_node->next = *head_ref;
    *head_ref = new_node;
}
 
/* Utility function to reverse a linked list */
void reverseList(struct Node** headref)
{
    struct Node* current = *headref;
    struct Node* prev = NULL;
    struct Node* next;
    while (current != NULL) {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
    *headref = prev;
}
 
/* Utility function to print a linked list */
void printList(struct Node* head)
{
    while (head != NULL) {
        printf("%d ", head->data);
        head = head->next;
    }
    printf("\n");
}
 
/* Driver program to test above functions */
int main()
{
    struct Node* head = NULL;
 
    /* Create following linked list
      12->15->10->11->5->6->2->3 */
    push(&head, 3);
    push(&head, 2);
    push(&head, 6);
    push(&head, 5);
    push(&head, 11);
    push(&head, 10);
    push(&head, 15);
    push(&head, 12);
 
    printf("Given Linked List \n");
    printList(head);
 
    delLesserNodes(&head);
 
    printf("Modified Linked List \n");
    printList(head);
 
    return 0;
}


Java
// Java program to delete nodes which have a greater value on
// right side
class LinkedList {
    Node head; // head of list
 
    /* Linked list Node*/
    class Node {
        int data;
        Node next;
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
 
    /* Deletes nodes which have a node with greater
       value node on left side */
    void delLesserNodes()
    {
        /* 1.Reverse the linked list */
        reverseList();
 
        /* 2) In the reversed list, delete nodes which
           have a node with greater value node on left
           side. Note that head node is never deleted
           because it is the leftmost node.*/
        _delLesserNodes();
 
        /* 3) Reverse the linked list again to retain
           the original order */
        reverseList();
    }
 
    /* Deletes nodes which have greater value node(s)
       on left side */
    void _delLesserNodes()
    {
        Node current = head;
 
        /* Initialise max */
        Node maxnode = head;
        Node temp;
 
        while (current != null && current.next != null) {
            /* If current is smaller than max, then delete
               current */
            if (current.next.data < maxnode.data) {
                temp = current.next;
                current.next = temp.next;
                temp = null;
            }
 
            /* If current is greater than max, then update
               max and move current */
            else {
                current = current.next;
                maxnode = current;
            }
        }
    }
 
    /* Utility functions */
 
    /* Inserts a new Node at front of the list. */
    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 reverse the linked list */
    void reverseList()
    {
        Node current = head;
        Node prev = null;
        Node next;
        while (current != null) {
            next = current.next;
            current.next = prev;
            prev = current;
            current = next;
        }
        head = prev;
    }
 
    /* Function to print linked list */
    void printList()
    {
        Node temp = head;
        while (temp != null) {
            System.out.print(temp.data + " ");
            temp = temp.next;
        }
        System.out.println();
    }
 
    /* Drier program to test above functions */
    public static void main(String args[])
    {
        LinkedList llist = new LinkedList();
 
        /* Constructed Linked List is 12->15->10->11->
           5->6->2->3 */
        llist.push(3);
        llist.push(2);
        llist.push(6);
        llist.push(5);
        llist.push(11);
        llist.push(10);
        llist.push(15);
        llist.push(12);
 
        System.out.println("Given Linked List");
        llist.printList();
 
        llist.delLesserNodes();
 
        System.out.println("Modified Linked List");
        llist.printList();
    }
} /* This code is contributed by Rajat Mishra */


C#
// C# program to delete nodes which have a greater value on
// right side
using System;
 
class LinkedList
{
    public Node head; // head of list
 
    /* Linked list Node*/
    public class Node
    {
        public int data;
        public Node next;
        public Node(int d)
        {
            data = d;
            next = null;
        }
    }
 
    /* Deletes nodes which have a node with greater
       value node on left side */
    void delLesserNodes()
    {
       
        /* 1.Reverse the linked list */
        reverseList();
 
        /* 2) In the reversed list, delete nodes which
           have a node with greater value node on left
           side. Note that head node is never deleted
           because it is the leftmost node.*/
        _delLesserNodes();
 
        /* 3) Reverse the linked list again to retain
           the original order */
        reverseList();
    }
 
    /* Deletes nodes which have greater value node(s)
       on left side */
    void _delLesserNodes()
    {
        Node current = head;
 
        /* Initialise max */
        Node maxnode = head;
        Node temp;
 
        while (current != null && current.next != null)
        {
           
            /* If current is smaller than max, then delete
               current */
            if (current.next.data < maxnode.data)
            {
                temp = current.next;
                current.next = temp.next;
                temp = null;
            }
 
            /* If current is greater than max, then update
               max and move current */
            else
            {
                current = current.next;
                maxnode = current;
            }
        }
    }
 
    /* Utility functions */
 
    /* Inserts a new Node at front of the list. */
    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 reverse the linked list */
    void reverseList()
    {
        Node current = head;
        Node prev = null;
        Node next;
        while (current != null)
        {
            next = current.next;
            current.next = prev;
            prev = current;
            current = next;
        }
        head = prev;
    }
 
    /* Function to print linked list */
    void printList()
    {
        Node temp = head;
        while (temp != null)
        {
            Console.Write(temp.data + " ");
            temp = temp.next;
        }
        Console.WriteLine();
    }
 
    /* Drier program to test above functions */
    public static void Main(string []args)
    {
        LinkedList llist = new LinkedList();
 
        /* Constructed Linked List is 12->15->10->11->
           5->6->2->3 */
        llist.push(3);
        llist.push(2);
        llist.push(6);
        llist.push(5);
        llist.push(11);
        llist.push(10);
        llist.push(15);
        llist.push(12);
 
        Console.WriteLine("Given Linked List");
        llist.printList();
        llist.delLesserNodes();
        Console.WriteLine("Modified Linked List");
        llist.printList();
    }
}
 
// This code is contributed by pratham76


Javascript


Java
// Java program for above approach
import java.io.*;
 
// This class represents a single node
// in a linked list
class Node {
     
    int data;
    Node next;
     
    public Node(int data){
        this.data = data;
        this.next = null;
    }
}
 
//This is a utility class for linked list
class LLUtil{
     
      // This function creates a linked list from a
    // given array and returns head
    public Node createLL(int[] arr){
         
        Node head = new Node(arr[0]);
        Node temp = head;
         
        Node newNode = null;
        for(int i = 1; i < arr.length; i++){
            newNode = new Node(arr[i]);
            temp.next = newNode;
            temp = temp.next;
        }
        return head;
    }
   
      //This function prints given linked list
      public void printLL(Node head){
         
        while(head != null){
            System.out.print(head.data + " ");
            head = head.next;
        }
        System.out.println();
    }
   
   
}
 
class GFG {
    public static void main (String[] args) {
         
          int[] arr = {12,15,10,11,5,6,2,3};
        LLUtil llu = new LLUtil();
          Node head = llu.createLL(arr);
        System.out.println("Given Linked List");
        llu.printLL(head);
        head = deleteNodesOnRightSide(head);
          System.out.println("Modified Linked List");
          llu.printLL(head);
           
    }
     
  //Main function
     public static Node deleteNodesOnRightSide(Node head){
         if(head == null || head.next == null) return head;
         Node nextNode = deleteNodesOnRightSide(head.next);
 
         if(nextNode.data > head.data) return nextNode;
         head.next = nextNode;
 
         return head;
    }
}


C#
// C# program for above approach
using System;
  
// This class represents a single node
// in a linked list
class Node
{
    public int data;
    public Node next;
      
    public Node(int data)
    {
        this.data = data;
        this.next = null;
    }
}
  
// This is a utility class for linked list
class LLUtil
{
     
    // This function creates a linked list
    // from a given array and returns head
    public Node createLL(int[] arr)
    {
        Node head = new Node(arr[0]);
        Node temp = head;
          
        Node newNode = null;
        for(int i = 1; i < arr.Length; i++)
        {
            newNode = new Node(arr[i]);
            temp.next = newNode;
            temp = temp.next;
        }
        return head;
    }
     
    // This function prints given linked list
    public void printLL(Node head)
    {
        while (head != null)
        {
            Console.Write(head.data + " ");
            head = head.next;
        }
        Console.WriteLine();
    }
}
 
class GFG{
 
// Driver Code
public static void Main(string[] args)
{
    int[] arr = { 12, 15, 10, 11, 5, 6, 2, 3 };
     
    LLUtil llu = new LLUtil();
    Node head = llu.createLL(arr);
     
    Console.WriteLine("Given Linked List");
    llu.printLL(head);
    deleteNodesOnRightSide(head);
     
    Console.WriteLine("Modified Linked List");
    llu.printLL(head);
}
  
// Main function
public static void deleteNodesOnRightSide(Node head)
{
 
    Node temp = head;
     
    while (temp != null && temp.next != null)
    {
         
        // Copying next node data into current node
        // i.e. we are indirectly deleting current node
        if (temp.data < temp.next.data)
        {
            temp.data = temp.next.data;
            temp.next = temp.next.next;
        }
        else
        {
             
            // Move to the next node
            temp = temp.next;
        }
    }
}
}
 
// This code is contributed by rutvik_56


Javascript


输出

Given Linked List 
 12 15 10 11 5 6 2 3
Modified Linked List 
 15 11 6 3

方法三:

另一种更简单的方法是从头开始遍历链表,当当前节点<下一个节点时删除该节点。要删除当前节点,请遵循此方法。

让我们假设您必须删除当前节点 X

1.将下一个节点的数据复制到X中即X.data = X.next.data

2、复制next节点的下一个地址即X.next = X.next.next;

仅当当前节点 > 下一个节点时才在列表中向前移动。

Java

// Java program for above approach
import java.io.*;
 
// This class represents a single node
// in a linked list
class Node {
     
    int data;
    Node next;
     
    public Node(int data){
        this.data = data;
        this.next = null;
    }
}
 
//This is a utility class for linked list
class LLUtil{
     
      // This function creates a linked list from a
    // given array and returns head
    public Node createLL(int[] arr){
         
        Node head = new Node(arr[0]);
        Node temp = head;
         
        Node newNode = null;
        for(int i = 1; i < arr.length; i++){
            newNode = new Node(arr[i]);
            temp.next = newNode;
            temp = temp.next;
        }
        return head;
    }
   
      //This function prints given linked list
      public void printLL(Node head){
         
        while(head != null){
            System.out.print(head.data + " ");
            head = head.next;
        }
        System.out.println();
    }
   
   
}
 
class GFG {
    public static void main (String[] args) {
         
          int[] arr = {12,15,10,11,5,6,2,3};
        LLUtil llu = new LLUtil();
          Node head = llu.createLL(arr);
        System.out.println("Given Linked List");
        llu.printLL(head);
        head = deleteNodesOnRightSide(head);
          System.out.println("Modified Linked List");
          llu.printLL(head);
           
    }
     
  //Main function
     public static Node deleteNodesOnRightSide(Node head){
         if(head == null || head.next == null) return head;
         Node nextNode = deleteNodesOnRightSide(head.next);
 
         if(nextNode.data > head.data) return nextNode;
         head.next = nextNode;
 
         return head;
    }
}

C#

// C# program for above approach
using System;
  
// This class represents a single node
// in a linked list
class Node
{
    public int data;
    public Node next;
      
    public Node(int data)
    {
        this.data = data;
        this.next = null;
    }
}
  
// This is a utility class for linked list
class LLUtil
{
     
    // This function creates a linked list
    // from a given array and returns head
    public Node createLL(int[] arr)
    {
        Node head = new Node(arr[0]);
        Node temp = head;
          
        Node newNode = null;
        for(int i = 1; i < arr.Length; i++)
        {
            newNode = new Node(arr[i]);
            temp.next = newNode;
            temp = temp.next;
        }
        return head;
    }
     
    // This function prints given linked list
    public void printLL(Node head)
    {
        while (head != null)
        {
            Console.Write(head.data + " ");
            head = head.next;
        }
        Console.WriteLine();
    }
}
 
class GFG{
 
// Driver Code
public static void Main(string[] args)
{
    int[] arr = { 12, 15, 10, 11, 5, 6, 2, 3 };
     
    LLUtil llu = new LLUtil();
    Node head = llu.createLL(arr);
     
    Console.WriteLine("Given Linked List");
    llu.printLL(head);
    deleteNodesOnRightSide(head);
     
    Console.WriteLine("Modified Linked List");
    llu.printLL(head);
}
  
// Main function
public static void deleteNodesOnRightSide(Node head)
{
 
    Node temp = head;
     
    while (temp != null && temp.next != null)
    {
         
        // Copying next node data into current node
        // i.e. we are indirectly deleting current node
        if (temp.data < temp.next.data)
        {
            temp.data = temp.next.data;
            temp.next = temp.next.next;
        }
        else
        {
             
            // Move to the next node
            temp = temp.next;
        }
    }
}
}
 
// This code is contributed by rutvik_56

Javascript


输出
Given Linked List
12 15 10 11 5 6 2 3 
Modified Linked List
15 11 6 3

来源:

https://www.geeksforgeeks.org/forum/topic/amazon-interview-question-for-software-engineerdeveloper-about-linked-lists-6

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