Дважды связанный список, вставьте перед данным узлом в Java - PullRequest
0 голосов
/ 09 октября 2018

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

Метод не работает:

public void insert_before_node(Node givenNode, int data) {
    Node newNode = new Node(data);
    newNode.prev = givenNode.prev;
    givenNode.prev = newNode;
    newNode.next = givenNode;

    if(newNode.prev != null)
        newNode.prev.next = newNode;
}

Другой метод добавления, который работает:

public void insert_front(int data) {
    Node newNode = new Node(data);
    newNode.next = head;
    newNode.prev = null;

    if(head != null)
        head.prev = newNode;
    head = newNode;
}

Метод печати для отладки:

public void print() {
    Node n = head;
    while(n != null){
        System.out.println(n.data);
        n = n.next;
    }
}

Класс DoublyLinkedList:

public class DoublyLinkedList {

    static class Node {
        int data;
        Node next;
        Node prev;

        Node(int data) {
            this.data = data;
            this.next = null;
            this.prev = null;
        }
    }

    Node head;

    DoublyLinkedList() {
        this.head = null;
    }

public static void main(String[] args) {

    DoublyLinkedList ll = new DoublyLinkedList();
    ll.insert_front(0);
    ll.insert_before_node(ll.head, 100);

    ll.print();

}
}

Реализации LinkedList и Node очень просты.Найдите здесь: https://www.geeksforgeeks.org/doubly-linked-list/

Сначала я создаю связанный список, вставляю значение, чтобы сделать заголовок ненулевым, а затем использую метод выше, чтобы вставить что-то еще.Вставка в front, end после того, как узел работает, однако этот insert_before_node () не работает.То, что я вставил этим методом, не отображается на моей распечатке.

Я тоже рисую на бумаге, но все еще не могу найти проблему.

Ссылка на geeksforgeeks также не имеет реализации Java дляэтот метод.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Ваш код работает, кроме присвоения головы в методе insert_front(Node,int), я думаю, что вы забыли this. до этого.

Плюс, возможно, вам понадобится

  • удалить аргумент head в методе insert_front (это глава dll, для этого есть член класса),
  • удалить подчеркивание (не рекомендуется Java, Сонар будет жаловаться)
  • возвращает созданные вами узлы, чтобы вы могли впоследствии ссылаться на них (и, возможно, создать свободный API)

Базовая переделка выглядела бы так: MVP:

import java.util.Objects;

public class DoubleLinkLists {

    public static void main(String[] args) {
        DoubleLinkedList dll = new DoubleLinkedList();

        DoubleLinkedList.Node node5 = dll.insertInFront(5);
        DoubleLinkedList.Node node4 = dll.insertInFront(4);
        DoubleLinkedList.Node node2 = dll.insertInFront(2);
        DoubleLinkedList.Node node1 = dll.insertInFront(1);
        DoubleLinkedList.Node node3 = dll.insertBefore(node4, 3);

        System.out.println(dll);
    }


    public static class DoubleLinkedList {
        Node head;

        @Override
        public String toString() {
            Node current = head;
            StringBuilder sb = new StringBuilder();

            while (current != null) {
                sb.append(current.data)
                  .append(" ");
                current = current.next;
            }

            return sb.toString();
        }

        public Node insertBefore(Node givenNode, int data) {
            Node newNode = new Node(data);
            newNode.prev = givenNode.prev;
            givenNode.prev = newNode;
            newNode.next = givenNode;

            if (newNode.prev != null) {
                newNode.prev.next = newNode;
            }

            return newNode;
        }

        public Node insertInFront(int data) {
            Node newNode = new Node(data);
            newNode.next = head;
            newNode.prev = null;

            if (head != null) {
                head.prev = newNode;
            }

            head = newNode;
            return newNode;
        }

        public static class Node {
            int data;

            Node prev;

            Node next;

            Node(int d) {
                data = d;
            }

            @Override
            public boolean equals(Object o) {
                if (this == o) return true;
                if (o == null || getClass() != o.getClass()) return false;
                Node node = (Node) o;
                return data == node.data;
            }

            @Override
            public int hashCode() {
                return Objects.hash(data);
            }
        }
    }
}
0 голосов
/ 09 октября 2018

Я редактирую код для большей читабельности.

public void insert_before_node(Node next, int data) {
    Node newNode = new Node(data);
    Node prev = next.prev;
    //left to right
    prev.next = newNode;
    newNode.next = next;
    //traverse right to left
    next.prev = newNode;
    newNode.prev = prev;
}

Я предполагаю, что next и prev также не равны нулю.

Кстати, вы должны добавить больше условий для обнаружения null (следующий и предыдущий) в insert_before_node.Пожалуйста, обновите результат и надеюсь, что он поможет.

...