Generi c методы удаления, размера, получения связанного списка - PullRequest
0 голосов
/ 05 мая 2020

Я только что видел этот замечательный код из этого вопроса «Generi c Linked List in java» здесь, в Stackoverflow. Я размышлял о том, как реализовать метод remove (чтобы удалить один узел из связанного списка), size (чтобы получить размер списка) и get (чтобы получить узел). Не мог бы кто-нибудь показать мне, как это сделать?

public class LinkedList<E> {
private Node head = null;

private class Node {
    E value;
    Node next;

    // Node constructor links the node as a new head
    Node(E value) {
        this.value = value;
        this.next = head;//Getting error here
        head = this;//Getting error here
    }
}

public void add(E e) {
    new Node(e);
}

public void dump() {
    for (Node n = head; n != null; n = n.next)
        System.out.print(n.value + " ");
}

public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<String>();
    list.add("world");
    list.add("Hello");
    list.dump();
}

}

1 Ответ

0 голосов
/ 05 мая 2020

Ваша реализация LinkedList для операций remove(), size() и contains() выглядит так:

static class LinkedList<Value extends Comparable> {

        private Node head = null;
        private int size;

        private class Node {
            Value val;
            Node next;

            Node(Value val) {
                this.val = val;
            }
        }

        public void add(Value val) {
            Node oldHead = head;
            head = new Node(val);
            head.next = oldHead;
            size++;
        }

        public void dump() {
            for (Node n = head; n != null; n = n.next)
                System.out.print(n.val + " ");
            System.out.println();
        }

        public int size() {
            return size;
        }

        public boolean contains(Value val) {
            for (Node n = head; n != null; n = n.next)
                if (n.val.compareTo(val) == 0)
                    return true;
            return false;
        }

        public void remove(Value val) {
            if (head == null) return;
            if (head.val.compareTo(val) == 0) {
                head = head.next;
                size--;
                return;
            }

            Node current = head;
            Node prev = head;
            while (current != null) {
                if (current.val.compareTo(val) == 0) {
                    prev.next = current.next;
                    size--;
                    break;
                }
                prev = current;
                current = current.next;
            }
        }
    }

...