无法理解头节点

时间:2015-12-17 05:32:57

标签: java data-structures

 private class Node {
        E element;
        Node next;
        Node prev;

        public Node(E element, Node next, Node prev) {
            this.element = element;
            this.next = next;
            this.prev = prev;
        }
    }
    /**
     * returns the size of the linked list
     * @return
     */
    public int size() { return size; }

    /**
     * return whether the list is empty or not
     * @return
     */
    public boolean isEmpty() { return size == 0; }

    /**
     * adds element at the starting of the linked list
     * @param element
     */
    public void addFirst(E element) {
        Node tmp = new Node(element, head, null);
        if(head != null ) {head.prev = tmp;}
        head = tmp;
        if(tail == null) { tail = tmp;}
        size++;
        System.out.println("adding: "+element);
    }

addFirst(E element)方法中使用java的doublelylinklist:

public void addFirst(E element) {
        Node tmp = new Node(element, head, null);
        if(head != null ) {head.prev = tmp;}
        head = tmp;
        if(tail == null) { tail = tmp;}
        size++;
        System.out.println("adding: "+element);
    }

怎么来head!=null。因为我们还没有在头部注释中添加任何元素 默认值应为null。当检查第一个if语句时,head==null是什么?

2 个答案:

答案 0 :(得分:0)

您可能希望在非空的LinkedList数据结构的头部插入一个Node。

例如,我可能有一个包含{1, 2}的列表,我想在该列表中的第0位插入值0。为此,我会在addFirst()上调用Node,其值为0 - 当我执行此操作时,head不是null。< / p>

答案 1 :(得分:0)

public void addFirst(E element) {



        Node tmp = new Node(element, head, null);
        if(head != null ) {//if head is null don't go in this body
           head.prev = tmp;//that means there is no node so no prev.
}
// if there is head make new node to be prev of head which is doing in if block
        head = tmp;//it becomes the first node in that case
        if(tail == null) { tail = tmp;}
        size++;
        System.out.println("adding: "+element);
    }

修改:现在您无法理解以下代码行的工作原理

 Node tmp = new Node(element, head, null);

所以这里有两种情况,当你添加第一个节点时,它是链表中的唯一节点,而另一种情况是有链表并且你要添加新的第一个节点。

所以让我们看一下有链表的第二个场景
因此,对于新节点,您需要将其next指向head作为上一个链接列表的头部,因为head已经存在,所以您需要添加一个从head到其prev tmp的链接。

请参阅此图片enter image description here

现在,当第一个场景中没有头节点已经存在时,临时节点将指向null(头部),这是出于一般目的的确如此。 所以这里

Node tmp = new Node(element, head, null);

您实际上是为第一个场景传递Node(element, null, null)

希望你现在明白为什么他们也会为第一个节点而去。

修改2

 public void addFirst(E element) {
        Node tmp = new Node(element, head, null);
        if(head != null ) {head.prev = tmp;
        System.out.println("its head");}
        if(head==null){System.out.println("its  not head");}
        head = tmp;
        if(tail == null) { tail = tmp;}
        size++;
        System.out.println("adding: "+element);
    }

如果你试试这个,它将为第一个元素打印“它不是头”。

所以不要混淆没有什么可以混淆的。它工作正常。