冒泡排序双链表Java

时间:2012-09-26 02:14:39

标签: java sorting linked-list bubble-sort doubly-linked-list

我正在尝试在Java中的双向链接列表上创建冒泡排序,但是我得到了Null Pointer Exception错误。我认为当我在头上调用getPrevious方法时遇到问题,当然它的值为null。但是,我不知道如何在不访问其他节点的getPrevious方法的情况下进行冒泡排序。

我可以实现一个if语句来检查列表的首尾或尾部,但我觉得有一种更聪明的方法可以做到这一点。

我也无法成功构建这个,所以我甚至不确定代码是否可行。如果您对如何实现这一点有不同的想法,请告诉我。

欢迎任何建议!

 public static void bubbleSort(DoubleLinkedList list) //static method used to sort the linked list using bubble sort
  {
      int i = 0;
      int j = 0;
      Node currentNode = list.head;
      Node previousNode = currentNode;
      Node tempNext =  currentNode;
      Node tempPrevious = currentNode;


      for(i=0; i<list.getSize(); i++)
      {
          for(j=0; j<list.getSize()-1; i++)
          {
              if(currentNode.getData() > currentNode.getNext().getData())
              {
                  tempNext = currentNode.getNext().getNext();
                  tempPrevious = currentNode.getPrevious();
                  currentNode.getPrevious().setNext(currentNode.getNext());
                  currentNode.getNext().setNext(currentNode);
                  currentNode.setPrevious(currentNode.getNext());
                  currentNode.setNext(tempNext);

              }

              currentNode = currentNode.getNext();

          }
      }



  }

1 个答案:

答案 0 :(得分:2)

所以你有一个双链表。我假设每个元素都包含一些信息......比如一个整数。它还必须包含两个指针:一个指向前一个元素,另一个指向下一个元素。

假设这是真的,请注意您不必修改指针,因为它们已经从一个元素指向另一个元素。您所要做的就是对列表元素的值进行排序,以便列表中的第一项具有最低值,第二项具有第二低值,依此类推。

你可以这样做:

public static void bubbleSort(DoubleLinkedList list) //static method used to sort the linked list using bubble sort {
      int i = 0;
      Node currentNode = list.head;
      Node auxNode;
      int foundChange = 1;
      while(foundChange) {
        foundChange = 0;
        for(i=0; i<list.getSize()-1; i++) {
          if (currentNode.getData() > currentNode.getNext().getData()) {
            auxNode.setData(currentNode.getData());
            currentNode.setData(currentNode.getNext.getData());
            currentNode.getNext.setData(auxNode.getData());
            foundChange = 1;
          }
          currentNode = currentNode.getNext();
        }

}

如果尚未定义setData方法,请执行此操作。它必须类似于getData,但它会将对象的数据设置为它作为参数获取的值,而不是返回该对象中数据的值。