繁体   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