将元素添加到循环单链接列表

时间:2012-10-28 18:26:46

标签: java

我正在尝试将一个元素添加到循环单链接列表的末尾以供我的作业 分配。但由于某些原因,我遇到了很多问题。

我有_tail指针和_dummy。 JUnit测试中的add方法说,在检查add方法时,它返回null而不是1.(1是添加到列表中的内容)

这是我的代码

 private static class Node<T>{
    Node<T> next;
    T data;
    public Node(T data, Node<T> next){
        this.next = next;
        this.data = data;
    }
}

private Node<T> _tail;
private int _count;
private int _version;
private Node<T> _dummy;  

 public CyclicLinkedList(){
    _dummy = new Node<T>(null, null);
    _dummy.next = _dummy;
    _tail = _dummy;
    _count = 0;
    assert _wellFormed();
}

这是我的添加方法

@Override
public boolean add(T x){
    assert _wellFormed();

    Node<T> n = new Node<T>(x, _tail.next);
    _tail.next = n;
    _tail = n;

    ++_version;
    ++_count;

    assert _wellFormed();
    return true;
}

assertWellformed表示链表是错误循环的。 _wellFormed()方法已经由类教师实现,因此不是问题。需要一些指示!谢谢。以下是测试是否错误循环的测试。

 // check for cycles:
    Node<T> fast = _tail.next;
    for (Node<T> p = _tail; fast != null && fast.next != null && fast != _tail       && fast.next != _tail; p = p.next) {
        if (p == fast) return _report("list is wrongly cyclic");
        fast = fast.next.next;
    }

1 个答案:

答案 0 :(得分:0)

_tail.next = n;
    _tail = n;

您应该在添加方法的代码开头添加一行: -

n.next = _tail.next;

因此,您的代码变为: -

n.next = _tail.next;
_tail.next = n;
_tail = n;

您需要让新节点指向第一个节点,使其成为循环节点。

因为_tail.next我假设必须指向第一个元素,然后才向List添加新节点,因此在添加_tail.next之前将n.next指定给n到列表中node现在也指向第一个n

因此,在第一行,您的节点: - _tail节点和_tail节点指向第一个节点。现在,从第一个节点分离n节点,并使其指向n节点。最后,将_tail节点设为{{1}}节点。