Nano Hash - криптовалюты, майнинг, программирование

Метод удаления и вставки связанного списка

У меня проблемы с методами удаления и вставки. Эти методы должны выполнять действие и возвращать логическое значение, если действие было успешным (истина) или нет (ложь). Метод InsertAfter будет вставлять строку, но всегда в одно и то же место, а метод Delete всегда будет удалять один и тот же узел.

private class StrNode {

        String data;
        StrNode next;
    }

    private StrNode head;   // the head of the singly-linked list.

    public StringList() {
        head = null;
    }

public void prepend(String s) {                                                         
        var newNode = new StrNode();
        // TODO: Adds an item to the start of the list.     
        newNode.data = s;
        if(head == null) {
            head = newNode;
        }
        else {
        newNode.next = head;
        head = newNode;
        }
        
    }

/**
     * Inserts an item after the first instance of a key if the key exists.
     *
     * @param s the item to insert
     * @param key the item in the list to insert after
     * @return whether the insertion was successful
     */
    public boolean insertAfter(String s, String key) {                                                      
        // TODO:    Inserts an item after the first instance of a key if the key exists.
        var newNode = new StrNode();
        StrNode current = head;
        newNode.data = s;
        
        if(head == null) {
            head = newNode;
        }
        else if(current == newNode.next){
            current.next = newNode;
            current = newNode;

        }
        else {
            newNode.next = current.next;
            current.next = newNode;
        }
        
        
        return false;
    }
    
    /**
     * Deletes the first instance of an item from the list.
     *
     * @param key the value of the item to delete from the list.
     * @return whether the deletion was successful.
     */
    public boolean delete(String key) {                                                     
        // TODO:    Deletes the first instance of an item from the list.
        StrNode current = head;
        StrNode sucNode = current;
        
        if(current == null) {
            sucNode = head.next;
            head = sucNode;
            return true;
        }
        else if(current.next != null) {
            sucNode = current.next.next;
            current.next = sucNode;
            return true;
        }

        return false;
    }

основной метод я хочу вставить четыре после трех, что должно быть: три, два, четыре, один. но я получаю: три, четыре, два, один

метод удаления просто удаляет четыре, которые на самом деле должны выглядеть так: три, четыре, два, но я получаю: три, два, один main:

public static void main(String[] args) {
        
        StringList s = new StringList();
        
        s.prepend("one");
        s.prepend("two");
        s.prepend("three");
        System.out.println(s);
        
        s.insertAfter("four", "three");
        System.out.println(s);
        
        System.out.println(s.delete("one"));
        System.out.println(s);
        
        
    }

26.10.2020

  • Я думал, что видел этот вопрос вчера. Вы снова выкладываете? Я хорошо помню метод prepend(), название которого кажется мне странным. Я бы использовал addFirst(). В любом случае вы должны включить код метода prepend(), потому что именно так вы все настраиваете. 26.10.2020
  • да, плохо, я думал, что сделаю вещи более ясными, просто чтобы увидеть методы, которые я пробую, спасибо! 26.10.2020

Ответы:


1

Вы спросили о двух методах:

insertAfter

Некоторые вопросы:

  • Вы не используете аргумент key.
  • В случае, если head равно нулю, вы никогда не сможете удовлетворить условию, согласно которому узел должен быть вставлен после узла с ключом, поэтому в этом случае вы должны вернуть false.
  • current инициализируется как head, поэтому вы назначаете новый узел head.next, не проверяя совпадения key...
  • Вы всегда возвращаете false, никогда true

Вы должны искать данный ключ, перебирая список:

public boolean insertAfter(String s, String key) {
    // Inserts an item after the first instance of a key if the key exists.
    StrNode current = head;
    
    while (current != null) {
        if (current.data == key) { // found the insertion spot
            var newNode = new StrNode();
            newNode.data = s;
            newNode.next = current.next;
            current.next = newNode;
            return true;
        }
        current = current.next; // need to walk along the list
    }
    return false; // didn't find the key
}

delete

  • Вы не используете аргумент key.
  • В случае, если head (равно current) равно нулю, вы никогда не сможете удовлетворить условию, что удаляемый узел должен иметь данный ключ, поэтому в этом случае вы должны вернуть false.
  • В другом случае вы всегда удаляете второй узел, не проверяя совпадения key...

Исправлено:

public boolean delete(String key) {                                                     
    // Deletes the first instance of an item from the list.
    StrNode current = head;
    if (head == null) return false;
    if (head.data == key) {
         head = head.next;
         return true;
    }

    while (current.next != null) {
        if (current.next.data == key) { // found it
            current.next = current.next.next; // delete it
            return true;
        }
        current = current.next; // need to walk along the list
    }
    return false; // not found
}

Замечание о prepend:

Вам не нужен оператор if. Код в блоке else отлично работает, когда head равен нулю, поэтому ваш код может быть таким:

public void prepend(String s) { 
    // Adds an item to the start of the list. 
    StrNode node = new StrNode();
    node.data = s;
    node.next = head;
    head = node;
}
26.10.2020
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..