簡體   English   中英

循環雙鏈表

[英]Circular Doubly Linked List

我需要Java中的雙向雙重鏈接列表的幫助。

這是我的代碼(最初由“ sanfoundry”編碼;它使用接口):

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;
    }


}

現在,我需要幫助才能使其正常運行。 我做錯了什么嗎?我必須在方法“ public T get(int index)”中編寫什么代碼? 抱歉,但我是Java新手:(

編輯:這是可能的解決方案嗎?

公共T get(int索引){

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;

}

您應該遍歷LinkedList,並在移動時跟蹤當前位置。 當您的當前位置等於傳入的索引時,則可以從該節點返回T。

在此處閱讀有關遍歷鏈接列表的信息

嘗試做一些測試用例。 理想情況下,您將要使用真實的測試框架,但使用常規的main方法可能會起作用。 例如:

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"

}

根據需要擴展測試。 看看代碼是否返回了您期望的結果,或者代碼是否永不返回,或引發異常等。...畢竟,檢查代碼是否正確運行的最簡單方法是實際運行它。

提示:撰寫本文時,該代碼存在一些錯誤。

另外,如果代碼可以按預期運行,請考慮:

  • 向后遍歷節點的速度比向前快。
  • 使用遞歸而不是迭代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM