添加到双向链表的末尾

时间:2015-12-09 00:12:18

标签: java algorithm doubly-linked-list

我真的很难在双链表的末尾添加一个节点,添加到头部很容易,现在我真的找不到添加到最后的方法。这看起来很愚蠢,但我失去了很多时间,所以如果有人能提供帮助,那将是值得赞赏的。这是我在Java中的部分实现。

public class DoublyLinkedList implements Iterable<Node>, Iterator<Node> {

private Node head = new Node();
private Node tail = head;
private Node current;
private Node previous;

@Override
public Iterator<Node> iterator() {
    current = head;
    previous = null;
    return this;
}

public void addToHead(Node node) {
    Node next = head.getNext(null);
    Node previous = head.getNext(next);
    head.setNext(previous, node);
    node.setNext(null, head);
    head = node;
}

@Override
public boolean hasNext() {
    return current != tail;
}

@Override
public Node next() {
    Node tmp = previous;
    previous = current;
    current = current.getNext(tmp);
    return previous;
}

这是节点类

public class Node {
Node next = null;
Node previous = null;


Node getNext(Node node){
    if(node == next){
        return previous;
    }

    if(node == previous){
        return next;
    }

    throw new IllegalStateException("something went wrong");
}

void setNext(Node node, Node next){
    if(node == previous){
        previous = next;
    }
    else if(node == this.next){
        this.next = next;
    }
    else{
        throw new IllegalStateException("something went wrong");
    }
}


}

我希望你能理解上面的代码,基本上我需要以下内容:

public void addToEnd(Node node) {
    // implementation
}

2 个答案:

答案 0 :(得分:1)

您希望在此双链表上实现哪个界面?您实施getNextsetNext的方式并不是一种明确的方式。如果您只有一个节点,并且尝试setNext null node的值,除非您查看新节点所在的代码,否则无法告知结果。除此之外,我不确定是否有一种很好的方法可以用你实现它的方式设置新尾节点的前一个节点。这很模糊。

我是否可以建议您在getNext()课程中实施setNext(Node)getPrevious()setPrevious(Node)Node方法?这将大大简化和清理您的代码。

然后,您就可以非常简单地实施addToEnd(Node)方法。

public void addToEnd(Node node) {
    node.setPrevious(tail);
    tail.setNext(node);
    tail = node;
}

如果您希望能够使用'getNext()'和'hasNext()'在两个方向上遍历列表,则可以提供正向或反向Iterator实现。有一些如何创建Iterators浮动的例子。这个question的第一个答案有一个反向迭代器的例子。

答案 1 :(得分:0)

基本思路与在列表开头添加相同。

我们可以把它分成两部分:

  1. 将项目添加到列表
  2. 更新列表的头/尾节点
  3. 在伪代码中:

    node to_insert
    
    //step 1
    tail.setNext(to_insert)
    to_insert.setPrevious(tail)
    
    //step 2
    tail = to_insert