圆形双重挂钩清单

时间:2015-05-19 20:55:49

标签: java doubly-linked-list

我需要帮助Java中的循环双链表。

这是我的代码(最初由" sanfoundry编码&#34 ;;它使用接口):

LinkedList.java:

public class LinkedList<T extends Comparable<T>> implements
        ILinkedList<T> {

    private ILinkedListNode<T> head;
    private ILinkedListNode<T> end;
    private int size;

    public LinkedList() {
        head = null;
        end = null;
        head = null;
        size = 0;
    }


    @Override
    public void append(T element) { 
        ILinkedListNode<T> tempNode = new LinkedListNode(element, null, null);

        if (head == null) {
            head = tempNode;
            end = head;


        } else {    
            tempNode.setPrev(end);
            tempNode.setNext(tempNode);
            end = tempNode;
        }
        size++;

    }
// should return element at position "index"
    @Override
    public T get(int index) {
        return null;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public ILinkedListNode<T> getHead() {
        return head;
    }


}

现在我需要帮助才能让它发挥作用。我做错了什么,我需要在方法中编码&#34; public T get(int index)&#34;?对不起,我是Java noob :(

编辑:这是一个可能的解决方案吗?

public T get(int index){

T element = null;

if (index == 0) {
    element = head.getElement();

} else if (index == size()-1) {
    element = head.getPrev().getElement(); // end.getElement() also possible

} else {
    ILinkedListNode<T> temp = head;
    for (int i = 0; i < index; i++) {
        temp = temp.getNext();
    }

    element = temp.getElement();

}
return element;

}

2 个答案:

答案 0 :(得分:1)

您应该遍历LinkedList,随时跟踪当前位置。当您的当前位置等于传入的索引时,您可以从该节点返回T.

了解如何遍历链接列表here

答案 1 :(得分:1)

尝试制作一些测试用例。理想情况下,您将需要使用真正的测试框架,但使用普通的主方法可以工作。例如:

public static void main(String[] args) {
    ILinkedList<String> a = new LinkedList<String>();

    System.out.println(a.size()); // 0
    System.out.println(a.getHead()); // null

    a.append("foo");
    System.out.println(a.size()); // 1
    System.out.println(a.get(0)); // "foo"
    System.out.println(a.get(1)); // decide yourself what this should result in

    a.append("bar");
    System.out.println(a.size()); // 2
    System.out.println(a.get(0)); // "foo"
    System.out.println(a.get(1)); // "bar"

    a.append("baz");
    System.out.println(a.size()); // 3
    System.out.println(a.get(0)); // "foo"
    System.out.println(a.get(1)); // "bar"
    System.out.println(a.get(2)); // "baz"

}

根据需要扩展测试。查看代码是否返回了您期望的代码,或者代码是否永远不会返回,或者抛出异常等等......最简单的方法是检查代码是否正常运行,实际上是运行它。 / p>

提示:截至本文撰写时,代码存在一些错误。

此外,如果代码可以按预期运行,请考虑:

  • 如果节点比前进更快,则向后遍历节点。
  • 使用递归而不是迭代。