Reputation: 77
I am implementing Selection sort in doubly - linked list. I have to sort list by surnames by finding smallest element and inserting it into beginning of the list. But there are some troubles, when I run my program I have NIL exception in Sort Method in while loop. It's whole app so you can compile it and run if you want. Help will be appreciated. Thanks.
public class LinkedList {
public Node first;
public Node last;
public LinkedList() {
first = null;
last = null;
}
public void addFirst(Student student) {
Node f = first;
Node newNode = new Node(student);
first = newNode;
if (f == null) last = newNode;
else {
f.previous = newNode;
newNode.next = f;
}
}
public void addLast(Student student) {
Node l = last;
Node newNode = new Node(student);
last = newNode;
if (l == null) first = newNode;
else {
l.next = newNode;
newNode.previous = l;
}
}
public void display() {
Node current = first;
while (current != null) {
System.out.print(current.student.name + "\b");
System.out.print(current.student.surname + "\b");
System.out.println(current.student.educationType);
current = current.next;
}
}
public Node findSmallest(Node startNode) {
Node smallest = startNode;
while (startNode.next != null) {
if (smallest.student.surname.compareToIgnoreCase(startNode.next.student.surname) > 1)
smallest = startNode.next;
else startNode = startNode.next;
}
return smallest;
}
public void Sort() {
LinkedList newList = new LinkedList();
Node current = first;
while (current.next != null) {
Node smallest = findSmallest(current);
newList.addLast(smallest.student);
delNode(smallest);
current = current.next;
}
first = newList.first;
last = newList.last;
}
public void delNode(Node toDel) {
if (toDel.previous == null) {
toDel.next.previous = null;
first = toDel.next;
return;
}
if (toDel.next == null) {
toDel.previous.next = null;
last = toDel.previous;
return;
}
toDel.previous.next = toDel.next;
toDel.next.previous = toDel.previous;
}
}
public class Student {
public String name;
public String surname;
public String educationType;
static public Student createStudent() {
Student student = new Student();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter student's name:");
student.name = br.readLine();
System.out.println("Enter surname:");
student.surname = br.readLine();
System.out.println("Enter educational type:");
student.educationType = br.readLine();
} catch (IOException e) {
throw new NotImplementedException();
}
return student;
}
}
public class Node {
public Student student;
public Node next;
public Node previous;
public Node(Student student) {
this.student = student;
}
}
Upvotes: 1
Views: 778
Reputation: 36777
I didn't run it, so it's just from looking at your code:
It's not really selection sort, as you're constructing new list instead of sorting the old one in place.
delNode() will fail with NPE for single element list, so maybe that's what's wrong (it will also fail if you're deleting last element).
Unless you're not allowed to, use sentinels.
Upvotes: 1