我真的很难在双链表的末尾添加一个节点,添加到头部很容易,现在我真的找不到添加到最后的方法。这看起来很愚蠢,但我失去了很多时间,所以如果有人能提供帮助,那将是值得赞赏的。这是我在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
}
答案 0 :(得分:1)
您希望在此双链表上实现哪个界面?您实施getNext
和setNext
的方式并不是一种明确的方式。如果您只有一个节点,并且尝试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)
基本思路与在列表开头添加相同。
我们可以把它分成两部分:
在伪代码中:
node to_insert
//step 1
tail.setNext(to_insert)
to_insert.setPrevious(tail)
//step 2
tail = to_insert