【问题标题】:How do I write an addElement method to a sorted LinkedList?如何将添加元素方法写入已排序的链表?
【发布时间】:2019-07-31 12:54:09
【问题描述】:

我有一个任务:

使用类 Node 实现一个 String 对象的链表(参见 Big >Java Early Objects 16.1.1)。编写方法,可以插入 > 和删除对象,以及打印列表中的所有对象。 >要求列表中的所有元素始终按照>字符串的自然顺序(可比较)进行排序。

我似乎无法正确使用的方法是 addElement 方法

全班都在这里:https://pastebin.com/Swwn8ykZ 和mainApp:https://pastebin.com/A22MFDQk

我看过这本书(Big Java Early Objects),也看过 geeksforgeeks

public void addElement(String e) {
    Node newNode = new Node();
    if (first.data == null) {
        first.data = e;
        System.out.println("Success! " + e + " has been 
added!");
    } else if (first.data.compareTo(e) == 0) {
        System.out.println("The element already exists in the 
list");
    } else {
        while (first.next != null) {
            if (first.next.data.compareTo(e) != 0) {
                first.next.data = e;
            } else {
                first.next = first.next.next;
            }
        }
    }
}

public static void main(String[] args) {
    SortedLinkedList list = new SortedLinkedList();

    String e1 = new String("albert");
    String e2 = new String("david");
    String e3 = new String("george");
    String e4 = new String("jannick");
    String e5 = new String("michael");

    // ----------------SINGLE LIST--------------------------
    list.addElement(e1);
    list.addElement(e2);
    list.addElement(e3);
    list.addElement(e4);
    list.addElement(e5);

    System.out.println("Should print elements after this:");
    list.udskrivElements();
 }
}

预期结果:五个名字打印在一个列表中

实际结果:打印的名字

【问题讨论】:

  • 您想以排序方式插入?
  • 尝试调试该方法以查看它的作用。提示:你永远不会“先”移动
  • @VinayHegde 是的,这正是我想要的 - 列表应该在插入前后进行排序
  • 顺便说一句,你的removeElement(来自 pastebin)也不起作用
  • @HansKesting 是的,它给该行一个 NullPointerException - if(temp.data.equals(e)) - 这对我来说没有任何意义,因为前面的行明确表示 - while (temp != null)...

标签: java singly-linked-list


【解决方案1】:

给定这个 Node 类:

private class Node {
    public String data;
    public Node next;
}

private Node first; 的类级字段,最初是null,表示一个空列表, addElement 可能是这样的:

public void addElement(String text) {
    if (text == null) return; // don't store null values

    Node extra = new Node();
    extra.data = text;

    if (first == null) {
        // no list yet, so create first element
        first = extra;
    } else {
        Node prev = null; // the "previous" node
        Node curr = first; // the "current" node

        while (curr != null && curr.data.compareTo(text) < 0) {
            prev = curr;
            curr = curr.next;
        }

        if (curr == null) {
            // went past end of list, so append
            prev.next = extra;
        } else if (curr.data.compareTo(text) == 0) {
            System.out.println("Already have a " + text);
        } else {
            // between prev and curr, or before the start
            extra.next = curr;
            if (prev != null) {
                prev.next = extra;
            } else {
                // append before start, so 'first' changes
                first = extra;
            }
        }
    }
}

顺便说一句,还可以尝试以未排序的顺序添加名称,以检查列表是否对它们进行了排序(尝试时我在代码中发现了一个错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2014-03-15
    • 2016-07-14
    相关资源
    最近更新 更多