【问题标题】:Using bubble sort with a linked list使用带链表的冒泡排序
【发布时间】:2013-04-16 02:50:21
【问题描述】:

我正在尝试编写一种方法,该方法将根据每个对象的整数变量(命名优先级)对链表的对象进行排序。我之前使用过数组列表并没有遇到任何问题,但是由于某种原因,当我尝试使用链表时,它给了我一个 NullPointerException 异常,我无法弄清楚我做错了什么。有什么建议吗?

public void sortList() {
    boolean flag = true;
    Item temp = null;
    Item position = head;
    Item positionLink = position.link;
    while(flag) {
        flag = false;
        while (position != null) {
            if(position.getPriority() > positionLink.getPriority()) {
                temp.setItem(position);
                position.setItem(positionLink);
                positionLink.link.setItem(temp);
                flag = true;
                position = position.getItem();
        }
        }
    }
}

【问题讨论】:

  • 请添加异常的stackTrace
  • @Algorithmist 有这么复杂吗? :) 当然,这只是一种很好的提问方式。
  • Vitaly,如果您觉得这是一个简单的问题,请直接回答,不要留下无用的 cmets。
  • 请随意查看我的回答 :)
  • @user2180462 始终检查异常堆栈跟踪以解决问题的核心。如果您检查堆栈跟踪,那么您将在几秒钟内解决 temp=null 问题。

标签: java sorting linked-list


【解决方案1】:

你没有初始化temp

 temp.setItem(position);

【讨论】:

    【解决方案2】:

    顺便说一句,你的算法看起来不对.. item.link 和 item.setItem().. 等等..

    应该是这样的:

    public void sortList() {
    
        boolean flag = true;
        while (flag) {
            flag = false;
    
            Item position = head;
            Item positionNext = position.link;
            Item positionPrev = null;
    
            while (positionNext != null) {
                if(position.getPriority() > positionNext.getPriority()) {
    
                    Item temp = position;
                    Item tempNextNext = positionNext.link;
                    position = positionNext;
                    position.link = temp;
                    positionNext = temp;
                    positionNext.link = tempNextNext;
    
                    if (positionPrev == null) { // position is head
                        head = position;
                    } else {
                        positionPrev.link = position;
                    }
    
                    flag = true;
                }
                positionPrev = position;
                position = position.link;
                positionNext = position.link;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:
       public void bubbleSort() {
              boolean swapped;
      
              do {
              Node curr = first;
              Node prev = null;
              swapped = false;
              while (curr.next != null) {
                  Node fwd = curr.next;
      
                  if (curr.item > curr.next.item) {
                      /**
                       * 3 pointers involved: prev, temp and temp.next. simply
                       * follow the order
                       * 
                       * prev.next = temp.next; 
                       * temp.next = temp.next.next;
                       * temp.next.next = temp;
                       */
      
                      /**
                       * egde case: prev: can be null temp & temp.next cannot be
                       * null.
                       */
      
                      if (prev != null) {
                          prev.next = fwd;
                      } else {
                          first = fwd;
                      }
                      // advance prev.
                      prev = fwd;
      
                      curr.next = fwd.next;
                      fwd.next = curr;
                      swapped = true;
                  } else {
                      prev = curr;
                      curr = curr.next;
                  }
              }
          } while (swapped);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        • 2012-09-29
        • 1970-01-01
        • 2012-07-19
        相关资源
        最近更新 更多