2

我正在尝试为我的家庭作业添加一个元素到循环单链表的末尾。但由于某种原因,我遇到了很多问题。

我有一个_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;
    }
4

1 回答 1

0
_tail.next = n;
    _tail = n;

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

n.next = _tail.next;

因此,您的代码变为: -

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

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

因为,_tail.next我假设必须指向第一个元素,然后再将新节点添加到List,所以在将它添加到列表之前分配_tail.next给现在也指向第一个。n.nextnnode

因此,在第一行,您的两个节点: -n节点和_tail节点,都指向第一个节点。现在,将您的_tail节点与第一个节点分离,并使其指向该n节点。最后,将您的n节点设为_tail节点。

于 2012-10-28T18:30:36.780 回答