Рубрики

Учитывая только указатель на узел, который будет удален в односвязном списке, как вы его удаляете?

Простым решением является обход связанного списка, пока вы не найдете узел, который хотите удалить. Но это решение требует указателя на головной узел, который противоречит постановке задачи.

Быстрое решение состоит в том, чтобы скопировать данные из следующего узла в удаляемый узел и удалить следующий узел. Что-то вроде следующего.

    struct Node *temp  = node_ptr->next;
    node_ptr->data  = temp->data;
    node_ptr->next  = temp->next;
    free(temp);

Программа:

C ++

// C ++ программа для удаления узла
// в котором только один указатель
// известно указание на этот узел
#include <bits/stdc++.h>
#include<assert.h>

using namespace std;

  
/ * Узел списка ссылок * /

class Node 

    public:

    int data; 

    Node* next; 

}; 

  
/ * Дана ссылка (указатель на указатель) на голову
списка и int, нажмите новый узел на передней панели
из списка. * /

void push(Node** head_ref, int new_data) 

    / * выделить узел * /

    Node* new_node = new Node();

      

    / * вставить данные * /

    new_node->data = new_data; 

      

    / * связать старый список с новым узлом * /

    new_node->next = (*head_ref); 

      

    / * переместить голову, чтобы указать на новый узел * /

    (*head_ref) = new_node; 

  

void printList(Node *head) 

    Node *temp = head; 

    while(temp != NULL) 

    

        cout << temp->data << " "

        temp = temp->next; 

    

  

void deleteNode(Node *node_ptr) 

    Node *temp = node_ptr->next; 

    node_ptr->data = temp->data; 

    node_ptr->next = temp->next; 

    free(temp); 

  
/ * Код водителя * /

int main() 

    / * Начнем с пустого списка * /

    Node* head = NULL; 

  

    / * Используйте push () для построения списка ниже

    1-> 12-> 1-> 4-> 1 * /

    push(&head, 1); 

    push(&head, 4); 

    push(&head, 1); 

    push(&head, 12); 

    push(&head, 1); 

  

    cout << "Before deleting \n"

    printList(head); 

  

    / * Я удаляю саму голову.

        Вы можете проверить больше случаев * /

    deleteNode(head); 

      

    cout << "\nAfter deleting \n"

    printList(head); 

    return 0;

  
// Этот код предоставлен rathbhupendra

С

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

  
/ * Узел списка ссылок * /

struct Node

{

    int data;

    struct Node* next;

};

  
/ * Дана ссылка (указатель на указатель) на голову
списка и int, нажмите новый узел на передней панели
из списка. * /

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;

}

  

void printList(struct Node *head)

{

   struct Node *temp = head;

   while(temp != NULL)

   {

      printf("%d  ", temp->data);

      temp = temp->next;

   }

}

  

void deleteNode(struct Node *node_ptr)

{

   struct Node *temp = node_ptr->next;

   node_ptr->data    = temp->data;

   node_ptr->next    = temp->next;

   free(temp);

}

  
/ * Программа драйвера для проверки вышеуказанной функции * /

int main()

{

    / * Начнем с пустого списка * /

    struct Node* head = NULL;

  

    / * Используйте push () для построения списка ниже

    1-> 12-> 1-> 4-> 1 * /

    push(&head, 1);

    push(&head, 4);

    push(&head, 1);

    push(&head, 12);

    push(&head, 1);

  

    printf("\n Before deleting \n");

    printList(head);

  

    / * Я удаляю саму голову.

        Вы можете проверить больше случаев * /

   deleteNode(head);

  

   printf("\n After deleting \n");

   printList(head);

   getchar();

}

Джава

// Java-программа для деления узла, в котором только один указатель
// известно указание на этот узел

  

class LinkedList {

  

    static Node head;

  

    static class Node {

  

        int data;

        Node next;

  

        Node(int d) {

            data = d;

            next = null;

        }

    }

  

    void printList(Node node) {

        while (node != null) {

            System.out.print(node.data + " ");

            node = node.next;

        }

    }

  

    void deleteNode(Node node) {

        Node temp = node.next;

        node.data = temp.data;

        node.next = temp.next;

        System.gc();

  

    }

  

    // Программа драйвера для проверки вышеуказанных функций

    public static void main(String[] args) {

        LinkedList list = new LinkedList();

        list.head = new Node(1);

        list.head.next = new Node(12);

        list.head.next.next = new Node(1);

        list.head.next.next.next = new Node(4);

        list.head.next.next.next.next = new Node(1);

  

        System.out.println("Before Deleting ");

        list.printList(head);

  

        / * Я удаляю саму голову.

         Вы можете проверить больше случаев * /

        list.deleteNode(head);

        System.out.println("");

        System.out.println("After deleting ");

        list.printList(head);

    }

}

  
// Этот код предоставлен Mayank Jaiswal

python3

# Python3 программа для удаления
# узел, в котором только один указатель
# известно, указывая на этот узел

  
# Узел связанного списка

class Node():

    def __init__(self):

        self.data = None

        self.next = None

  
# Дана ссылка (указатель на указатель)
# в начало списка и int,
# толкать новый узел в начале списка

def push(head_ref, new_data):

  

    # выделить узел

    new_node = Node()

  

    # положить в данные

    new_node.data = new_data

  

    # связать старый список с новым узлом

    new_node.next = head_ref

  

    # переместить голову, чтобы указать на новый узел

    head_ref = new_node

  

    return head_ref

  

def printList(head):

    temp = head

    while(temp != None):

        print(temp.data, end = ' ')

        temp = temp.next

  

def deleteNode(node_ptr):

    temp = node_ptr.next

    node_ptr.data = temp.data

    node_ptr.next = temp.next

  
# Код драйвера

if __name__ == '__main__':

  

    # Начнем с пустого списка

    head = None

  

    # Используйте push () для построения списка ниже

    # 1-> 12-> 1-> 4-> 1

    head = push(head, 1)

    head = push(head, 4)

    head = push(head, 1)

    head = push(head, 12)

    head = push(head, 1)

  

    print("Before deleting ")

    printList(head)

  

    # Я удаляю саму голову.

    # Вы можете проверить больше случаев

    deleteNode(head)

  

    print("\nAfter deleting")

    printList(head)

  
# Этот код предоставлен Yashyasvi Agarwal

C #

// C # программа для удаления узла в
// который является только одним указателем
// известный указатель на этот узел

using System;

  

public class LinkedList

  

    Node head; 

  

    public class Node

    

  

        public int data; 

        public Node next; 

  

        public Node(int d) 

        

            data = d; 

            next = null

        

    

  

    void printList(Node node)

    

        while (node != null

        

            Console.Write(node.data + " "); 

            node = node.next; 

        

    

  

    void deleteNode(Node node) 

    

        Node temp = node.next; 

        node.data = temp.data; 

        node.next = temp.next; 

    

  

    // Код драйвера

    public static void Main() 

    

        LinkedList list = new LinkedList(); 

        list.head = new Node(1); 

        list.head.next = new Node(12); 

        list.head.next.next = new Node(1); 

        list.head.next.next.next = new Node(4); 

        list.head.next.next.next.next = new Node(1); 

  

        Console.WriteLine("Before Deleting "); 

        list.printList(list.head); 

  

        / * Я удаляю саму голову.

        Вы можете проверить больше случаев * /

        list.deleteNode(list.head); 

        Console.WriteLine(""); 

        Console.WriteLine("After deleting "); 

        list.printList(list.head); 

    

  
/ * Этот код предоставлен PrinciRaj1992 * /


Выход:

Before Deleting 
1 12 1 4 1 
After deleting 
12 1 4 1 

Это решение не работает, если удаляемый узел является последним узлом списка. Чтобы заставить это решение работать, мы можем отметить конечный узел как фиктивный узел. Но программы / функции, которые используют эту функцию, также должны быть изменены.

Попробуйте эту проблему для двусвязного списка.

Рекомендуемые посты:

Учитывая только указатель на узел, который будет удален в односвязном списке, как вы его удаляете?

0.00 (0%) 0 votes