Можем ли мы вернуть указатель последнего элемента в связанном списке на первый элемент? - PullRequest
0 голосов
/ 22 января 2019

Я пишу код для удаления дубликатов из связанного списка. Код указан ниже:

Здесь я создаю набор и вставляю все данные узла. Если он возвращает true, то есть элемент отсутствует в наборе и не был добавлен ранее в Set, он добавит данные узла в этот набор, в противном случае ссылка на узел соответствующих данных из предыдущего узла будет удалена и сместит указатель заголовка на следующий узел. После выхода из цикла while у нас есть голова, указывающая на последний элемент. Если я показываю его, то отображается только последний элемент, а не дубликат удаленного списка Как снова поместить указатель головы на начальный узел с последнего узла, чтобы я мог напечатать связанный список?

    final Node ref = head;
    final Set<Integer> s = new HashSet<Integer>();

    /*
     * while (null != head.next) { final Node rn = head.next; if (!s.add(head.next.data)) { if (null !=
     * head.next.next) { head.next = head.next.next; } } head = rn; }
     */
    while (null != head.next) {
        // final Node rn = head.next;
        if (!s.add(head.data)) {
            if (null != head.next) {
                head = head.next;
            }
        }
        head = head.next;
    }
    final boolean b1 = s.add(head.data);
    if (b1 == false) {
        head = null;
    }
    head = ref;
    return head;

1 Ответ

0 голосов
/ 25 июля 2019

Вы уже взяли ссылку на узел Node в переменной Node ref, и вы использовали заголовок Node для обхода, поэтому просто верните переменную Node ref в конце. Это даст вам желаемый результат, учитывая, что остальная часть кода верна.

Попробуйте это:

    final Node ref = head;
    final Set<Integer> s = new HashSet<Integer>();

    /*
     * while (null != head.next) { final Node rn = head.next; if (!s.add(head.next.data)) { if (null !=
     * head.next.next) { head.next = head.next.next; } } head = rn; }
     */
    while (null != head.next) {
        // final Node rn = head.next;
        if (!s.add(head.data)) {
            if (null != head.next) {
                head = head.next;
            }
        }
        head = head.next;
    }
    final boolean b1 = s.add(head.data);
    if (b1 == false) {
        head = null;
    }

    return ref;

Снять головку = ref!

Или, если вы хотите использовать набор для удаления дубликатов из связанного списка, вы можете использовать LinkedHashSet, LinkedHashSet поддерживает порядок вставки, подход представлен ниже:

        if(head==null)
            return null;

        Node n = head;
        LinkedHashSet<Integer> lSet = new LinkedHashSet<>();

        while(n.next!=null){
            lSet.add(n.data);
            n = n.next;
        }

        lSet.add(n.data);

        Iterator<Integer> it = lSet.iterator();

        Node newHead = new Node(it.next());

        Node listNodes = newHead;

        while(it.hasNext()){
            listNodes.next = new Node(it.next());
            listNodes = listNodes.next;

        }

        return newHead;

...