繁体   English   中英

在Java中将元素添加到单链列表

[英]Adding an element to a singly linked list in Java

我正在用Java实现一个单链表。 我对这段代码if (head.next == null)是,每次添加元素时都需要检查if (head.next == null) 但是,添加第一个元素时,该条件仅满足一次。

没有这种条件,有没有办法实现单链接的非循环列表?

package sample;

import java.util.Iterator;
import java.util.NoSuchElementException;

public class SinglyLinkedList<T> implements Iterable<T> {

    private Node<T> head = new Node<T>(null);
    private Node<T> last = null;

    public SinglyLinkedList(T... elements) {
        addAll(elements);
    }

    public void add(T element) {
        if (head.next == null) {
            head.next = new Node<T>(element);
            last = head.next;
        } else {
            Node<T> newNode = new Node<T>(element);
            last.next = newNode;
            last = last.next;
        }
    }

    public void addAll(T... elements) {
        for (T element : elements) {
            add(element);
        }
    }

    @Override
    public String toString() {
        Iterator<T> iterator = iterator();
        if (!iterator.hasNext()) {
            return "[]";
        }
        StringBuilder builder = new StringBuilder();
        builder.append("[");
        while (iterator.hasNext()) {
            T element = iterator.next();
            builder.append(element);
            if (!iterator.hasNext()) {
                return builder.append("]").toString();
            }
            builder.append(", ");
        }
        return builder.toString();
    }

    @Override
    public Iterator<T> iterator() {
        return new Iterator<T>() {

            Node<T> current = head;

            @Override
            public boolean hasNext() {
                return current.next != null;
            }

            @Override
            public T next() {
                if (!hasNext()) {
                    throw new NoSuchElementException();
                }
                Node<T> temp = current;
                current = current.next;
                return temp.next.element;
            }

        };
    }

    private static class Node<T> {

        private Node<T> next;
        private T element;

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

        @Override
        public String toString() {
            return element.toString();
        }
    }
}

在许多情况下,“良好的OO设计”使您无需进行if / else检查。 最常见的是使用某种形式的多态性。

含义:您可以确保客户端代码可以简单地在其他对象上调用方法,而不是向某个对象询问某些属性,然后再在客户端代码中对该属性做出决定。 然后,在最初生成该“另一个对象”并将其提供给您的客户代码的代码中,“隐藏”了“ if”。 (您会在这些视频中找到一些不错的示例)。

但是-我认为在这种情况下,这显然是过大的!

关键是:从可读性的角度来看,一次检查确实没有任何伤害(您可以将事情重构为更多的方法)。 性能……也没关系。 如果经常调用您的代码,而这很重要,那么无论如何JIT都会启动,并且可能会创建在大多数情况下直接采用正确分支的代码。

因此:这是一个不错的实现; 而且我认为您不应该为此担心而已!

您可以将last初始化为指向head,然后if是否多余:

private Node<T> head = new Node<T>(null);
private Node<T> last = head;

public void add(T element) {
        Node<T> newNode = new Node<T>(element);
        last.next = newNode;
        last = last.next;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM