(a) Write a method in class SLL<T> called public SLL<T> reverse() that produces a new linked list with the contents of the original list reversed. Make sure not to use any methods like addToHead() or addToTail(). In addition, consider any special cases that might arise.
(b) What is the big-O complexity of your method in terms of the list size n.
******
//************************ SLLNode.java
*******************************
// node
in a generic singly linked list class
public class SLLNode<T> {
public T info;
public SLLNode<T> next;
public SLLNode() {
this(null,null);
}
public SLLNode(T el) {
this(el,null);
}
public SLLNode(T el, SLLNode<T> ptr)
{
info = el; next =
ptr;
}
}
*******
//************************** SLL.java
*********************************
// a
generic singly linked list class
public class SLL<T> {
protected SLLNode<T> head, tail;
public SLL() {
head = tail =
null;
}
public boolean isEmpty() {
return head ==
null;
}
public void addToHead(T el) {
head = new
SLLNode<T>(el,head);
if (tail == null)
tail = head;
}
public void addToTail(T el) {
if (!isEmpty()) {
tail.next = new SLLNode<T>(el);
tail = tail.next;
}
else head = tail = new
SLLNode<T>(el);
}
public T deleteFromHead() { // delete the head
and return its info;
if (isEmpty())
return null;
T el = head.info;
if (head ==
tail) // if only one node on
the list;
head = tail = null;
else head =
head.next;
return el;
}
public T deleteFromTail() { // delete the tail
and return its info;
if (isEmpty())
return null;
T el = tail.info;
if (head ==
tail) // if only one node in
the list;
head = tail = null;
else
{
// if more than one node in the list,
SLLNode<T> tmp; // find the predecessor of
tail;
for (tmp = head; tmp.next != tail; tmp = tmp.next);
tail = tmp; // the
predecessor of tail becomes tail;
tail.next = null;
}
return el;
}
public void delete(T el) { // delete the node
with an element el;
if (!isEmpty())
if (head == tail && el.equals(head.info)) // if only
one
head = tail = null; // node on
the list;
else if (el.equals(head.info)) // if more than one node on the
list;
head = head.next; // and el is in the head
node;
else
{
// if more than one node in the list
SLLNode<T> pred, tmp;// and el is in a nonhead node;
for (pred = head, tmp = head.next;
tmp != null && !tmp.info.equals(el);
pred = pred.next, tmp = tmp.next);
if (tmp != null) { // if el was found;
pred.next = tmp.next;
if (tmp == tail) // if el is in the last node;
tail = pred;
}
}
}
public void printAll() {
for (SLLNode<T>
tmp = head; tmp != null; tmp = tmp.next)
System.out.print(tmp.info + "
");
}
public boolean isInList(T el) {
SLLNode<T>
tmp;
for (tmp = head; tmp !=
null && !tmp.info.equals(el); tmp = tmp.next);
return tmp !=
null;
}
}
****
//LinkedListApplication
public class LinkedListApplication {
public static void main(String[] args) {
SLL<String> myList = new
SLL<String>();
for(int i = 0; i < 5; i++)
myList.addToHead("A" + i);
myList.printAll();
}
}
*******
public SLL<T> reverse() { SLL<T> result = new SLL<>(); for (SLLNode<T> tmp = head; tmp != null; tmp = tmp.next) { result.head = new SLLNode<>(tmp.info, result.head); if(tmp == head) { result.tail = result.head; } } return result; }
************************************************** Thanks for your question. We try our best to help you with detailed answers, But in any case, if you need any modification or have a query/issue with respect to above answer, Please ask that in the comment section. We will surely try to address your query ASAP and resolve the issue.
Please consider providing a thumbs up to this question if it helps you. by Doing that, You will help other students, who are facing similar issue.
Get Answers For Free
Most questions answered within 1 hours.