вставка данных после определенных данных (двойной список ссылок) - PullRequest
1 голос
/ 13 ноября 2010

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

** public static void insertAfter (Object o, Object c) {

    Node newN = new Node();
    Node help = new Node();
    Node help2 = new Node();
    newN.data = o;
    help = head.next;
    if(isEmpty()){
        head = newN;
        newN.next=head;
        newN.prev=head;
    }
    else{
        do{
            help=help.next;
            System.out.println(help);
        }while(help.next!=head || !help.data.equals(c));
        help2 = help.next;
        newN.next = help2;
        help2.prev = newN;
        help.next=newN;
        newN.prev=help;
    }**

кто-нибудь может помочь?спасибо!

Ответы [ 3 ]

1 голос
/ 13 ноября 2010

Какие объекты вы сравниваете? если они являются чем-то отличным от строки, вам придется переопределить метод equals (), чтобы получить правильное сравнение.

1 голос
/ 13 ноября 2010

Сделай сам

Я начал исправлять ваше решение, но закончил писать совершенно новую реализацию, когда захотел протестировать его ... вот так:

public class DoubleLinkedList<T> {

    private class Node {
        private Node prev;
        private Node next;
        private T data;

        Node(T data) {
            this.data = data;
        }
    }

    Node head;

    public boolean isEmpty() {
        return head == null;
    }

    public void insertAfter(T afterThis, T objectToAdd) {

        // cannot insert after in a empty list?!
        if(isEmpty())
            throw new NoSuchElementException("list is empty?");

        // find the node where we want to insert the element
        Node after = findNodeByObject(afterThis);

        // create the node and update the links
        addAfter(after, new Node(objectToAdd));
    }

    private void add(T objectToAdd) {
        if (isEmpty()) {
            head = new Node(objectToAdd);
            head.next = head;
            head.prev = head;
        }
        else {
            addAfter(head.prev, new Node(objectToAdd));
        }
    }

    private void addAfter(Node after, Node toAdd) {

        Node afterAfter = after.next;

        after.next = toAdd;
        afterAfter.prev = toAdd;

        toAdd.prev = after;
        toAdd.next = afterAfter;
    }

    private Node findNodeByObject(T object) {

        Node current = head;

        while (true) {
            if (current.data.equals(object))
                return current;

            if (current.next == head)
                break;

            current = current.next;
        }

        throw new NoSuchElementException("" + object);
    }

    @Override
    public String toString() {

        List<T> printList = new LinkedList<T>();

        Node current = head;

        while (true) {
            printList.add(current.data);

            if (current.next == head)
                break;

            current = current.next;
        }

        return printList.toString();
    }


    public static void main(String[] args) throws Exception {
        DoubleLinkedList<String> list = new DoubleLinkedList<String>();

        list.add("first");
        list.add("third");
        list.insertAfter("first", "second");

        System.out.println(list);
    }
}

Расширить LinkedList

... и добавьте метод insertAfter следующим образом:

import java.util.LinkedList;
import java.util.ListIterator;

public class MyList<T> extends LinkedList<T> {

    private void insertAfter(T first, T second) {

        ListIterator<T> iterator = listIterator();
        while (iterator.hasNext()) {
            if (iterator.next().equals(first)) {
                iterator.add(second);
                return;
            }
        }

        throw new IndexOutOfBoundsException("Could not find " + first);
    }


    public static void main(String[] args) throws Exception {
        MyList<String> list = new MyList<String>();
        list.add("first");
        list.add("third");
        list.insertAfter("first", "second");

        System.out.println(list); // prints "[first, second, third]"
    }
}
1 голос
/ 13 ноября 2010

Я думаю, вам следует попробовать другое условие завершения:

while(help.next!=head && !help.data.equals(c));

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

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

Кроме того, ваши переменные должны иметь четкие и значимые имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...