不使用Java库按字母顺序对链接列表进行排序

时间:2014-12-13 12:51:39

标签: java sorting linked-list bubble-sort

我试图通过下面写的方法对我的单链表进行排序。我尝试使用冒泡排序,但我不认为我的排序正常。顺便说一句,我没有得到任何NullPointerException。

public void lister()
{ 
    int n, c, d, swap;
    Node tempNode = head;

    for (c = 0; c < ( size - 1 ); c++)
    {
        tempNode = head;
        for (d = 0; d < size - c - 1; d++)
        {
            String compare1 = ((Person)tempNode.getNext().getElement()).getName() + " " +
                ((Person)tempNode.getNext().getElement()).getSur();
            String compare2 = ((Person)tempNode.getElement()).getName() + " " +
                ((Person)tempNode.getElement()).getSur();

            if (compare1.compareTo(compare2) < 0)
            {
                Person tempPerson = (Person) tempNode.getElement();
                tempNode.setElement(tempNode.getNext().getElement());
                tempNode.getNext().setElement(tempPerson);
            }

            if(tempNode.getNext() != null)
                tempNode = tempNode.getNext();
        } // End of inner for loop
    } // End of outer for loop
} // End of lister function

我对Person对象的输入&#39;姓名和姓氏字段是:

  1. 姓名:aaaa,姓:aaaa
  2. 姓名:cccc,姓:cccc
  3. 姓名:bbbb,姓:bbbb
  4. 我将此作为排序输出:

    1. aaaa aaaa
    2. bbbb bbbb
    3. bbbb bbbb
    4. 我使用的其他源代码,您可能需要检查:

      list()方法:

      private static void list()
      {
          contactList.lister();
          contactList.listResults();
          int listNum = input.nextInt();
          contactList.getInOrder(listNum);
      }
      

      SLinkedList类:

      import java.util.*;
      
      /** Singly linked list implementation .*/
      public class SLinkedList<E> implements LinkedList<E>, Iterable<E>
      {
          protected Node<E> head;     // head node of the list
          protected Node<E> tail;     // tail node of the list
          protected int size;         // number of nodes in the list
      
          public Iterator<E> iterator()
          {
              return new LinkedListIterator(head);
          }
      
          /** Default constructor that creates an empty list */
          public SLinkedList()
          {
              head = null;
              tail = null;
              size = 0;
          }
      
          public int size() { 
              return size;
          }
      
          public boolean isEmpty() {
              return size == 0;
          }
      
          public void addFirst(E newElement)
          {
              Node<E> newNode = new Node(newElement,null);
      
              if(size == 0) //if list is empty
                  tail = newNode;
      
              newNode.setNext(head);
              head = newNode;
              size++;
          }
      
          public void addLast(E newElement)
          {
              Node<E> newNode = new Node(newElement,null);
      
              if(size == 0) //if list is empty
                  head = newNode;
      
              if (size != 0) //if list is not empty
                  tail.setNext(newNode);
      
              tail = newNode;
              size++;
          }
      
          public E removeFirst()
          {
              Node<E> tempNode = null;
              if (size != 0) {
              if(size == 1)
                  tail = null;
      
              tempNode = head;
              head = head.getNext();
              tempNode.setNext(null);
              size--;
      
              //if list is empty then return null
              return tempNode.getElement();
          }
      
          public E removeLast()
          {
              Node<E> tempNode = head;
      
              if(size == 0)
                  return null;
      
              if(size == 1) {
                  head = null;
                  tail = null;
                  size--;
                  return tempNode.getElement();
              }
      
              //size is greater than 1
              for(int i=1; i<=size-2; i++) {
                  tempNode = tempNode.getNext(); //go to element that before the tail
              }
      
              Node<E> tempNode2 = tail;
              tail = tempNode;
              tail.setNext(null);
              size--;
              return tempNode2.getElement();
          }
      
          public void remove(E element)
          {
              int index = 0;
              boolean found = false;
              Node<E> temp = head;
              for(int i=1; i<=size; i++) { //find the node with element
                  index++;
                  if(temp.getElement().equals(element)){
                      found = true;
                      break;
                  }
                  temp = temp.getNext(); 
              }
      
              if(found){
                  if(index == 1) 
                      removeFirst();
                  else if(index == size)
                      removeLast();
              }
              else{   
                  //find the previous node
                  Node<E> prev = head;
                  for(int i=1; i<index-1; i++) {
                      prev = prev.getNext(); 
                  }
      
                  prev.setNext(temp.getNext());
                  temp.setNext(null);
                  size--;
              }
          }
      
          public int searchList(E searchKey) {
              if(size == 0)
                  return -1;
      
              Node tempNode = head;
              for(int i=1; i<=size; i++) {
                  if(tempNode.getElement().equals(searchKey))
                      return i; //return index of the node
                  tempNode = tempNode.getNext();
              }
      
              return -1; //not found
          }
      
          public void printList() {
              Node tempNode = head;
              for(int i=1; i<=size; i++) {
                  System.out.print(tempNode.getElement());
      
                  if(i!=size) //if it is not last element
                      System.out.print(" - ");
      
                  tempNode = tempNode.getNext();
              }
              System.out.println();
          }
      
          public void listResults()
          {
              Node tempNode = head;
              for(int i = 1; i <= size; i++)
              {
                  System.out.println(i + ". " +((Person) tempNode.getElement()).getName() + " " + 
                      ((Person) tempNode.getElement()).getSur());
      
                  tempNode = head.getNext();
              }
          }
      
          public void getInOrder(int o)
          {
              Scanner input = new Scanner(System.in);
              Node tempNode = head;
              for(int i=1; i <= size; i++)
              {
                  if(i==o)
                  {
                      System.out.println(tempNode.getElement());
                  }
                  tempNode = tempNode.getNext();
              }
              System.out.println("a:[<=] d:[=>] u:[update] i:[insert] r:[delete] e:[exit]");
      
              String action = input.next();
      
              if(action.equals("e"))
              {
      
              }
              else if(action.equals("a") && (o-1) != 0)
              {
                  getInOrder(o - 1);
              }
              else if(action.equals("d") && (o+1) <= 9)
              {
                  getInOrder(o + 1);
              }
              else if(action.equals("u"))
              {
                  System.out.println("New Name: ");
                  String nName = input.next();
                  System.out.println("New Surname: ");
                  String nSur = input.next();
                  System.out.println("New Address: ");
                  String nAdd = input.next();
      
                  ((Person)tempNode.getElement()).setName(nName);
                  ((Person)tempNode.getElement()).setSur(nSur);
                  ((Person)tempNode.getElement()).setAdd(nAdd);               
              }
              else if(action.equals("i"))
              {
                  System.out.println("Add a new number:\nType the type of the phone number:");
                  String phoneType = input.next();
                  System.out.println("Type the number: ");
                  int phoneInput = input.nextInt();
                  ((Person) getFromResults(o)).insertPhone(new PhoneNumber(phoneInput,phoneType));
              }
              else if(action.equals("r"))
              {
                  //NullPointerException
                  int index = 0;
                  boolean found = false;
                  Node<E> temp = head;
                  for(int i=1; i<=size; i++) {//find the node with element
                      index++;
                      if(tempNode.getElement().equals(temp.getElement())){
                          found = true;
                          break;
                      }
                      temp = temp.getNext(); 
                  }
      
                  if(found){
                      if(index == 1) 
                          removeFirst();
      
                      else if(index == size)
                          removeLast();
      
                      else{   
                          //find the previous node
                          Node<E> prev = head;
                          for(int i=1; i<index-1; i++) {
                              prev = prev.getNext(); 
                          }
      
                          prev.setNext(temp.getNext());
                          temp.setNext(null);
                          size--;
                      }
                  }
              }       
          }
      
          public void lister()
          { 
               //Alternative bubble sort i found from internet.
               int n, c, d, swap;
      
              Node tempNode = head;
      
              for (c = 0; c < ( size - 1 ); c++)
              {
                  tempNode = head;
                  for (d = 0; d < size - c - 1; d++)
                  {
                      String compare1 = ((Person)tempNode.getNext().getElement()).getName() + " " + 
                          ((Person)tempNode.getNext().getElement()).getSur();
                      String compare2 = ((Person)tempNode.getElement()).getName() + " " + 
                          ((Person)tempNode.getElement()).getSur();
                      if (compare1.compareTo(compare2) < 0)
                      {
                          Person tempPerson = (Person) tempNode.getElement();
                          tempNode.setElement(tempNode.getNext().getElement());
                          tempNode.getNext().setElement(tempPerson);
                      }
                      if(tempNode.getNext() != null)
                          tempNode = tempNode.getNext();
                  }
              }
          }
      }
      

0 个答案:

没有答案