将患者添加到我实现的链表类中

时间:2016-11-25 01:08:47

标签: java oop collections linked-list nodes

我编写的程序将患者添加到链表中。现在我能够得到输出。我调整了我的代码,以便根据严重程度从最高到最低插入患者,如果严重程度相同,则根据时间。我的患者类有三个属性名称,到达和严重程度。

编辑3

我在compareSeverity课程中添加了Patient方法。

public boolean compareSeverity(Patient other) {
 boolean result = false;
 if(other.severity > severity) {
  result = true;
 } else if(other.severity == severity) {
    if(other.arrival > arrival) {
     result = true;
    } else {
      result = false;
   }
  } else {
     result = false;
  }
  return result;
 }

这是PatientNode代码段。

class PatientNode {
 public Patient data;
 public PatientNode next;

 public PatientNode(Patient data, PatientNode next) {
  this.data = data;
  this.next = next;
  }
}

这是add类中的linked list方法。

public void add(String name, int severity) {
 lastArrival++;
 Patient patient = new Patient(name, lastArrival, severity);
 PatientNode current, previous;
 current = head;
 previous = null;
 if(head == null) {
  head = current = new PatientNode(patient, head);
  size++;
 } else {
   while(current!=null) {
    //previous = current;
    if(current.data.compareSeverity(patient)) {
     PatientNode n = new PatientNode(patient,current);
     size++;
     n.next = current;
     if(previous==null) {
      head = n;
     } else {
       previous.next = n;
     }

     return;
    }
   previous = current;
   current = current.next;
  }
 }
}

我现在得到的输出是这个,但问题似乎与相同的 severity患者有关。

我希望我的输出看起来像这样:

  

患者1,到达2,严重程度3

     

患者2,到达3,严重程度3

或者如果他们有不同的严重性,那么就像这样:

  

患者1,到达2,严重程度2

     

患者2,到达1,严重程度1

简而言之severity必须按降序排列,如果严重程度相同,则根据arrival按升序存储它们。

任何想法/指针或我可以根据严重程度存储患者的一些伪代码都会非常棒,谢谢。

2 个答案:

答案 0 :(得分:1)

你的while循环中有错误!

  1. 在LinkedList中更改内容时要刻意:确保更改正确的节点。假设您的情况是当前列表

    node1 --> node2 --> node4 --> node5
    

    我们有一个PatientNode node3,必须在node4之前的列表中插入,如下所示:

    node1 --> node2 --> **node3** --> node4 --> node5
    

    我们必须更改的内容只是next的{​​{1}}字段必须为node2,而node3字段为next字段}本身(必须是node3) 如果我们查看您的代码,那么在while循环中,您有节点node4n,分别是必须添加的新节点和迭代期间的当前节点。在循环中,您需要验证p是否必须在n之前,以及必须时,您执行此操作:

    p

    这是错的!将其与示例中的n.next = p.next; p.next = n; node3进行比较:node4必须在n之前,因为p必须在node3之前。因此node4对应n,p对应node3您只需要更改node4 (对应于nextp节点的父级的node2字段。您不需要触摸n 。要解决此问题,您可以简单地更改while循环中的if语句:将p更改为p.data

  2. 您在循环中遇到的另一个错误是,您没有在添加患者的地方休息,因为它的p.next.data更高。但我建议您尽可能减少arrival秒的使用时间。在设置break - 变量时,请在循环条件中使用其值:added

  3. 这是一个更好的建议:使用正确的while(p.next!=null && !added){ - 条件,而不是仅使用else if作为ifif内唯一的内容else 1}} - 子句

  4. 这也是一个建议。我会强烈推断LinkedList,其中最后一个节点保留指向第一个节点(head)的指针。特别是在这里,因为如果next发生变化,则没有代码可以更新最后一个元素的head值。这可能会产生非常奇怪的结果(因为最后一个元素指向第二个元素而不是第一个元素)并且如果没有足够的注意力会导致不同的错误(特别是在递归的情况下堆栈溢出错误)

  5. 所以最后你的add - 函数看起来应该是这样的:

    public void add(String name, int severity) {
        Patient patient;
    
        lastArrival++;
        patient = new Patient(name, lastArrival, severity);
        PatientNode n = new PatientNode(patient, null);
    
        if(head==null) {
          head = n;
          size++;
          return;
        } else if(n.data.getSeverity() > head.data.getSeverity()) {
          n.next = head;
          size++;
          head = n;
          return;
        }
    
        PatientNode p = head;
        boolean added = false;
        while(p.next!=null && !added) {
          if(p.next.data.getSeverity() < severity) {
            n.next = p.next;
            p.next = n;
            added = true;
          } else if(p.next.data.getSeverity()== severity && p.next.data.getArrival() > lastArrival) {
            n.next = p.next;
            p.next = n;
            added = true;
          }
          p=p.next;
        }
        if(!added) {
          p.next = n;
        }
        size++;
    }
    

    我在每种情况下都放回了size++

    我使用我提出的更正复制了您的代码并生成了minimal working code。我使用您发布的方法创建了包含最小字段(headsizelastArrival和仅add函数)和类Patient的类LinkedPatients 3个字段(namearrivalseverity)。我尝试在你发布的第一个输出中重新创建你的三个场景(看起来你有一种remove方法,但你没有发布它所以最后一个案例并不完全相同)。您可以点击链接并检查输出。

答案 1 :(得分:0)

使用compareSeverity进行代码更新后:

  • 条件if(other.arrival > arrival) {应该是if(other.arrival < arrival) {,而if - 条款可以在compareSeverity方法中简化,因为您只需要指定何时需要设置true上的值,而不是使用。

    初始化变量的false
    public boolean compareSeverity(Patient other) {
        boolean result = false;
        if((other.severity > severity) || (other.severity == severity && other.arrival < arrival)) {
            result = true;
        }
        return result;
    }
    

    因为它只是设置一个布尔值,你甚至可以让它成为:

    public boolean compareSeverity(Patient other) {
        return (other.severity > severity) || (other.severity == severity && other.arrival < arrival);
    }
    
  • 您在while循环后忘记了add方法中的if条件。如果current成为null该怎么办?如果您无法将患者插入链接列表中,则必须将其作为最后一个元素放在后面。

    public void add(String name, int severity) {
        lastArrival++;
        Patient patient = new Patient(name, lastArrival, severity);
        if(head == null) {
            head = new PatientNode(patient, head);
            size++;
        } else {
            PatientNode current, previous;
            current = head;
            previous = null;
            while(current!=null) {
                if(current.data.compareSeverity(patient)) {
                    PatientNode n = new PatientNode(patient,current);
                    size++;
                    //n.next = current; // overkill
                    if(previous==null) {
                        head = n;
                    } else {
                        previous.next = n;
                    }
                    return;
                }
                previous = current;
                current = current.next;
            }
            if(current == null){
                previous.next = new PatientNode(patient, null);
                size++;
            }
        }
    }
    

我可以为您提供a working example更新后的代码