我试图通过下面写的方法对我的单链表进行排序。我尝试使用冒泡排序,但我不认为我的排序正常。顺便说一句,我没有得到任何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;姓名和姓氏字段是:
我将此作为排序输出:
我使用的其他源代码,您可能需要检查:
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();
}
}
}
}