LinkedList根据优先级编号添加新节点

时间:2016-12-17 14:09:25

标签: java data-structures linked-list adt

我的java数据结构分配要求是创建食物管理以将食物分配给自然灾害的受害者,并且还需要处理3种类型的受害者,即儿童,老人和成人。

我想要实现的是说我有一个LinkedList来安排优先级。所以现在我有一个Person对象向下转换为VictimPatient。我需要处理受害者。

受害者对象

  • setPriority(此处我将受害者分为优先级1,2,3,childoldfolksadults根据他们的DOB确定

所以现在我将有一个受害者对象和优先权。

我的想法是在链接列表ADT中,我将其分为3个部分,首先是child,第2个是oldfolks,第3个是adults

enter image description here

上面是我的想法的图片,当添加一个新受害者并且优先级为2时,我需要获得最后一个老人,然后将新受害者放在后面,然后递增lastOldFolk位置。

以下是我到目前为止所做的事情: -

public boolean addByPriority(T newEntry, int priority) {
        Node newNode = new Node(newEntry);
        System.out.println(firstNode);

        if (firstNode == null) {//if empty list then straight away assign
            firstNode = newNode;
            switch (priority) {//update the last location of each priorities
                case 1:
                    lastChild++;
                    lastSenior++;
                    lastAdult++;
                    break;
                case 2:
                    lastSenior++;
                    lastAdult++;
                    break;
                case 3:
                    lastAdult++;
                    break;
            }
            return true;
        } else if (firstNode != null && priority == 1) {//if priority is 1 then add here
            Node node = firstNode;
            for (int i = 0; i < lastChild; i++) {
                node = node.next;
            }
            Node savedNext = node.next;
            node.next = newNode;
            node.next.next = savedNext;
            lastChild++;
        } else if (firstNode != null && priority == 2) {
        } else {
        }
        length++;
        return true;
    }

所以现在在我的主程序中,我添加了3个优先级,之后我添加了另一个newEntry优先级为1,它将存储在优先级为1的第4个位置,但如果我添加另一个新优先级则不起作用1.我是数据结构的新手,希望有人能够启发我。

P / S:我不允许使用arraylist或任何Java API来完成任务,我必须创建自己的ADT才能解决问题。感谢。

2 个答案:

答案 0 :(得分:0)

您的解决方案似乎不必要地复杂化;我要做的就是创建一个类,比如Line,它拥有3个独立的列表。像这样:

class Line {
    private ArrayList<Victim> children;
    private ArrayList<Victim> oldFolks;
    private ArrayList<Victim> adults;

    public void addByPriority(Victim newEntry, int priority) {
        switch(priority) {
        case 1:
             children.add(newEntry);
        break;
        case 2:
             oldFolks.add(newEntry);
        break;
        case 3:
             adults.add(newEntry);
        break;
    }

    public void nextPatient() {
        if(!children.isEmpty()) return children.remove(0);
        if(!oldFolks.isEmpty()) return oldFolks.remove(0);
        if(!adults.isEmpty()) return adults.remove(0);
        return null; // or throw exception, as you like
    }
}

这里我使用了ArrayList,但是肯定还有其他一些堆栈的Java库实现(比如this one),它更适合这个目的。

你甚至可以让Line类实现list interface,这样你仍然可以像任何其他标准列表一样使用它(你需要覆盖方法,考虑到3个队列)

希望这有帮助

答案 1 :(得分:0)

由于您扫描列表而未直接访问展示位置, 没有必要跟踪最后的&lt;&gt;每种类型。

你可以做一个简单的while循环,直到你到达一个优先级较低的节点 比新节点或null,即应添加新节点。 如果列表为null,则只需放入新节点。

ISomeElement