194 lines
4.5 KiB
Java
194 lines
4.5 KiB
Java
class ListNode {
|
|
|
|
private Object data;
|
|
private ListNode next;
|
|
|
|
public ListNode(Object o) { data = o; next = null; }
|
|
public ListNode(Object o, ListNode nextNode)
|
|
{ data = o; next = nextNode; }
|
|
|
|
public Object getData() { return data; }
|
|
public void setData(Object o) { data = o; }
|
|
|
|
public ListNode getNext() { return next; }
|
|
public void setNext(ListNode next) { this.next = next; }
|
|
|
|
|
|
} // class ListNode
|
|
|
|
class EmptyListException extends RuntimeException {
|
|
public EmptyListException ()
|
|
{ super("List is empty"); }
|
|
} // class EmptyListException
|
|
|
|
public class LinkedList {
|
|
|
|
private ListNode head;
|
|
private ListNode tail;
|
|
|
|
private int length; // the length of the list
|
|
|
|
public LinkedList() {
|
|
head = tail = null;
|
|
length = 0;
|
|
}
|
|
|
|
public boolean isEmpty() { return head == null; }
|
|
|
|
public void addToHead(Object item) {
|
|
if (isEmpty())
|
|
head = tail = new ListNode(item);
|
|
else
|
|
head = new ListNode(item, head);
|
|
length++;
|
|
}
|
|
|
|
public void addToTail(Object item) {
|
|
if (isEmpty())
|
|
head = tail = new ListNode(item);
|
|
else {
|
|
tail.setNext(new ListNode(item));
|
|
tail = tail.getNext();
|
|
}
|
|
length++;
|
|
}
|
|
|
|
public Object removeFromHead() throws EmptyListException {
|
|
Object item = null;
|
|
if (isEmpty())
|
|
throw new EmptyListException();
|
|
item = head.getData();
|
|
if (head == tail)
|
|
head = tail = null;
|
|
else
|
|
head = head.getNext();
|
|
length--;
|
|
return item;
|
|
}
|
|
|
|
public Object removeFromTail() throws EmptyListException {
|
|
Object item = null;
|
|
if (isEmpty())
|
|
throw new EmptyListException();
|
|
item = tail.getData();
|
|
if (head == tail)
|
|
head = tail = null;
|
|
else {
|
|
ListNode current = head;
|
|
while (current.getNext() != tail)
|
|
current = current.getNext();
|
|
tail = current;
|
|
current.setNext(null);
|
|
}
|
|
length--;
|
|
return item;
|
|
}
|
|
|
|
public int count() {
|
|
return length;
|
|
}
|
|
|
|
// students need to revise toString method
|
|
public String toString() {
|
|
String str = "";
|
|
ListNode current = head;
|
|
while (current != null) {
|
|
FoodOrder foodOrder = (FoodOrder) current.getData();
|
|
str += foodOrder + "\n";
|
|
current = current.getNext();
|
|
}
|
|
return str;
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
Removes a ListNode from the LinkedList with a specific Member ID.
|
|
|
|
@param targetID the Member ID of the ListNode to be removed
|
|
|
|
@throws EmptyListException if the list is empty
|
|
*/
|
|
public void remove(int targetID) throws EmptyListException {
|
|
|
|
// Throw an exception if the list is empty
|
|
if (isEmpty()) {
|
|
throw new EmptyListException();
|
|
}
|
|
|
|
// If the target node is the head node, remove it from the head
|
|
if (((FoodOrder) head.getData()).getMemberID() == targetID) {
|
|
removeFromHead();
|
|
return;
|
|
}
|
|
|
|
// Traverse the linked list to find the target node
|
|
ListNode current = head.getNext();
|
|
ListNode prev = head;
|
|
|
|
while (current != null && ((FoodOrder) current.getData()).getMemberID() != targetID) {
|
|
prev = current;
|
|
current = current.getNext();
|
|
}
|
|
|
|
// If the target node is found, remove it
|
|
if (current != null) {
|
|
prev.setNext(current.getNext());
|
|
length--;
|
|
}
|
|
}
|
|
|
|
/**
|
|
|
|
Checks if the linked list contains a FoodOrder object with the given targetID as its member ID.
|
|
@param targetID the member ID to search for in the linked list
|
|
@return true if the linked list contains a FoodOrder object with the given targetID as its member ID, false otherwise
|
|
*/
|
|
public boolean contain(int targetID) {
|
|
ListNode current = head;
|
|
while (current != null) {
|
|
if (((FoodOrder) current.getData()).getMemberID() == targetID) {
|
|
return true;
|
|
}
|
|
current = current.getNext();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
|
|
Adds a new FoodOrder to the LinkedList in the correct position based on its priority.
|
|
@param item the FoodOrder to add to the LinkedList
|
|
*/
|
|
public void add(Object item) {
|
|
FoodOrder foodOrderItem = (FoodOrder) item;
|
|
|
|
// if the list is empty, add the new node as the head
|
|
if (isEmpty())
|
|
addToHead(item);
|
|
|
|
// if the new node has higher priority than the head, add it as the new head
|
|
else if (foodOrderItem.getPriority() < ((FoodOrder) head.getData()).getPriority())
|
|
addToHead(item);
|
|
|
|
// if the new node has lower priority than the tail, add it as the new tail
|
|
else if (foodOrderItem.getPriority() >= ((FoodOrder) tail.getData()).getPriority())
|
|
addToTail(item);
|
|
|
|
// otherwise, find the correct position for the new node and insert it
|
|
else {
|
|
ListNode current = head.getNext();
|
|
ListNode prev = head;
|
|
|
|
while (current != null && foodOrderItem.getPriority() >= ((FoodOrder) current.getData()).getPriority()) {
|
|
prev = current;
|
|
current = current.getNext();
|
|
}
|
|
|
|
prev.setNext(new ListNode(item, current));
|
|
length++;
|
|
}
|
|
}
|
|
|
|
}
|