簡體   English   中英

帶有字符串 Java 的雙鏈表

[英]Double Linked List with String Java

我編寫了以下程序:

public class DLinkedList<T extends Comparable<T>> {

    private class DNode<T> {
        private DNode<T> prev, next;
        private T nodeValue;
        public DNode() {
            nodeValue = null;
            next = prev = this;
            }

        public DNode(T val) {
            nodeValue = val;
            next = prev = this;
            }
        }

    private DNode<T> header;

    private int size;

    public DLinkedList() {
        header = new DNode<T>();
        size = 0;
    }

    public Boolean empty() {
        return size == 0;
    }

    public int size() {
        return size;
    }

    public void addOrder(T val) {
        DNode<T> newNode = new DNode<T>(val);
        DNode<T> curr = header.next;
        int count = 0;

        while (curr != header &&
            curr.nodeValue.compareTo(newNode.nodeValue) < 0 ) {

            curr = curr.next;
            newNode.prev = curr;
            newNode.next = curr.next;
            newNode.next.prev = curr;
            count++;
        }

        if (count == 1) {
            newNode.prev = curr;
            newNode.next = curr.prev;
            curr.prev.next.next = newNode;

        } else {
            newNode.prev = curr.prev;
            newNode.next = curr;
            curr.prev.next = newNode;
            count++;
        }
    }

    public String toString() {
        String str = "";
        DNode<T> curr = header.next;
        while (curr != header) {
            str += curr.nodeValue + ", ";
            curr = curr.next;
        }
        if (str.length() > 0) {
            return str.substring(0, str.lastIndexOf(", "));
        } else {
            return str;
        }
    }

    public static void main(String[] args) {
            DLinkedList<String> d = new DLinkedList<String>();
            d.addOrder("t");
            d.addOrder("y");
            d.addOrder("e");
            d.addOrder("b");
            d.addOrder("p");
            System.out.println("List 1: t, y, e, b, p" + "\nList 1 added and sort : " +d);
    }
}

我對如何解決我的問題感到困惑/迷茫。 我想創建一個包含字符串值的節點的雙鏈表,當我將這些字符串值添加到列表中時,列表會通過插入排序對其進行自動排序。

我從一個具有空值的節點調用標頭開始。 然后當我使用addOrder(T val)方法將字符串 "t, y, e, b, p" 添加到列表中時,一切似乎都有效。 它將按“b、e、p、t、y”的排序順序打印出來。

如果我決定在最后不打印“p”,而是執行“t, y, e, b, c”,我打印出來的只是“b, c”而不是執行“b, c, e”,則會出現問題, t, y”。 如果我在列表末尾添加“a”而不是“p”或“c”,那么一切似乎都可以很好地打印“a、b、e、t、y”。 所以它似乎適用於所有不是“c,d,e”的東西。 好像我需要編寫一個方法來添加一個 newNode ,它將在它們之間移動,我現在不知如何去做。

如果我決定添加字符串“t, y, e, v, p”,則會出現另一個問題。 看起來這只是打印“e,p”。 它似乎添加了“t,y,e,v”,但是當“p”進來時,它去掉了“t,y,v”並留下了“e,p”。

似乎我無法在“ft”之間添加任何內容,但是在此之前或之后的任何內容都可以。 我有一種感覺,它與我的索引“curr”有關,也許它與我的節點標題有關。

你的一些代碼似乎有點混亂。 您有一個循環,用於跳過列表直到找到插入點,但它同時更改了新節點的指針和現有節點。 我只會在該循環中使用curr = curr.next ,並且在找到插入位置之前根本不更改新節點的指針或現有列表,然后記住您總共需要更改四個指針:新節點中的 next 和 previous ,其前驅中的 next 指針,以及其后繼中的前一個指針。

            while (curr != header &&
                    curr.nodeValue.compareTo(newNode.nodeValue) < 0 ) {

                    curr = curr.next;
                    newNode.prev = curr;
                    newNode.next = curr.next;
                    newNode.next.prev = curr;
                    count++;
            }

我有一個關於如何調試的網頁,您可能會覺得有幫助。

我同意代碼有點混亂,您應該從 while 循環中刪除分配,但修復似乎很簡單。

在循環之后的部分中,您需要在不進行計數檢查的情況下切換您的分配:

newNode.prev = curr.prev;
newNode.next = curr;
curr.prev.next = newNode;
curr.prev = newNode;

在插入“p”時使用“t, y, e, v, p”的示例中,當前光標位於字母“t”上。 此時,您希望“p”指向“t”,並且前一個指向“t”前一個,在本例中為“e”。

我還沒有測試你的其他場景,但這看起來像你所缺少的。

暫無
暫無

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

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