In: Computer Science
Without dramatically changing the code please add a basic "linked list in ascending order" (option 7). Please leave comments within the code so I can understand what is being done, thank you.
import java.util.Scanner;
/* Class Node */
class Node
{
protected int data;
protected Node link;
public Node()
{
link = null;
data = 0;
}
public Node(int d,Node n)
{
data = d;
link = n;
}
public void setLink(Node n)
{
link = n;
}
public void setData(int d)
{
data = d;
}
public Node getLink()
{
return link;
}
public int getData()
{
return data;
}
}
class linkedList
{
protected Node start;
protected Node end ;
public int size ;
public linkedList()
{
start = null;
end = null;
size = 0;
}
public boolean isEmpty()
{
return start == null;
}
public int getSize()
{
   return size;
}
public void insertAtStart(int val)
{
Node nptr = new Node(val, null);
size++ ;
if(start == null)
{
start = nptr;
end = start;
}
else
{
nptr.setLink(start);
start = nptr;
}
}
public void insertAtEnd(int val)
{
Node nptr = new Node(val,null);
size++ ;
if(start == null)
{
   start = nptr;
end = start;
}
else
{
end.setLink(nptr);
end = nptr;
}
}
public void insertAtPos(int val , int pos)
{
Node nptr = new Node(val, null);
Node ptr = start;
pos = pos - 1 ;
for (int i = 1; i < size; i++)
{
   if (i == pos)
{
Node tmp = ptr.getLink() ;
ptr.setLink(nptr);
nptr.setLink(tmp);
break;
}
ptr = ptr.getLink();
}
size++ ;
}
public void deleteAtPos(int pos)
{   
if (pos == 1)
{
start = start.getLink();
size--;
return ;
}
if (pos == size)
{
Node s = start;
Node t = start;
while (s != end)
{
t = s;
s = s.getLink();
}
end = t;
end.setLink(null);
size --;
return;
}
Node ptr = start;
pos = pos - 1 ;
for (int i = 1; i < size - 1; i++)
{
if (i == pos)
{
Node tmp = ptr.getLink();
tmp = tmp.getLink();
ptr.setLink(tmp);
break;
}
ptr = ptr.getLink();
}
size-- ;
}
public void display()
   {
System.out.print("\nSingly Linked List = ");
if (size == 0)
{
System.out.print("empty\n");
return;
}
if (start.getLink() == null)
{
System.out.println(start.getData() );
return;
}
Node ptr = start;
System.out.print(start.getData()+ "->");
ptr = start.getLink();
while (ptr.getLink() != null)
{
System.out.print(ptr.getData()+ "->");
ptr = ptr.getLink();
}
System.out.print(ptr.getData()+ "\n");
}
}
import java.util.Scanner;
/* Class SinglyLinkedList */
public class SinglyLinkedList
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
/* Creating object of class linkedList */
linkedList list = new linkedList();
System.out.println("Singly Linked List Test\n");
char ch;
/* Perform list operations */
do
{
System.out.println("\nSingly Linked List Operations\n");
System.out.println("1. insert at begining");
System.out.println("2. insert at end");
System.out.println("3. insert at position");
System.out.println("4. delete at position");
System.out.println("5. check empty");
System.out.println("6. get size");
int choice = scan.nextInt();
switch (choice)
{
case 1 :
System.out.println("Enter integer element to insert");
list.insertAtStart( scan.nextInt() );
break;
case 2 :
System.out.println("Enter integer element to insert");
list.insertAtEnd( scan.nextInt() );
break;
case 3 :
System.out.println("Enter integer element to insert");
int num = scan.nextInt() ;
System.out.println("Enter position");
int pos = scan.nextInt() ;
if (pos <= 1 || pos > list.getSize() )
System.out.println("Invalid position\n");
else
list.insertAtPos(num, pos);
break;
case 4 :
System.out.println("Enter position");
int p = scan.nextInt() ;
if (p < 1 || p > list.getSize() )
System.out.println("Invalid position\n");
else
list.deleteAtPos(p);
break;
case 5 :
System.out.println("Empty status = "+ list.isEmpty());
break;
case 6 :
System.out.println("Size = "+ list.getSize() +" \n");
break;
   default :
System.out.println("Wrong Entry \n ");
break;
}
/* Display List */
list.display();
System.out.println("\nDo you want to continue (Type y or n)
\n");
ch = scan.next().charAt(0);
} while (ch == 'Y'|| ch == 'y');
}
}
As per the requirement, below is the method that would convert the list in ascending order. It is well explained inside the code using comments:
// This method will make the linked list in ascending
order
    void ascending() {
        Node ptr = start, next =
null;
        int
tempData;   // to store temp data during
operation
        // if list is
not empty
        if (!isEmpty()) {
           
// keep looping until ptr becomes null,
           
// means until whole list is iterated
           
while (ptr != null) {
               
// next link
               
next = ptr.getLink();
               
// keep looping until next ptr becomes null
               
while (next != null) {
                   
// if current node data is greater than next, swap the nodes
                   
if (ptr.getData() > next.getData()) {
                       
tempData = ptr.getData();
                       
ptr.setData(next.getData());
                       
next.setData(tempData);
                   
}
                   
// move next to next position
                   
next = next.getLink();
               
}
               
ptr = ptr.getLink();
           
}
        }
    }
Below is the complete code, with changes highlighted in bold:
import java.util.Scanner;
/* Class Node */
class Node {
    protected int data;
    protected Node link;
    public Node() {
        link = null;
        data = 0;
    }
    public Node(int d, Node n) {
        data = d;
        link = n;
    }
    public void setLink(Node n) {
        link = n;
    }
    public void setData(int d) {
        data = d;
    }
    public Node getLink() {
        return link;
    }
    public int getData() {
        return data;
    }
}
class linkedList {
    protected Node start;
    protected Node end;
    public int size;
    public linkedList() {
        start = null;
        end = null;
        size = 0;
    }
    public boolean isEmpty() {
        return start ==
null;
    }
    public int getSize() {
        return size;
    }
    public void insertAtStart(int val) {
        Node nptr = new
Node(val, null);
        size++;
        if (start == null)
{
           
start = nptr;
           
end = start;
        } else {
           
nptr.setLink(start);
           
start = nptr;
        }
    }
    public void insertAtEnd(int val) {
        Node nptr = new
Node(val, null);
        size++;
        if (start == null)
{
           
start = nptr;
           
end = start;
        } else {
           
end.setLink(nptr);
           
end = nptr;
        }
    }
    public void insertAtPos(int val, int pos)
{
        Node nptr = new
Node(val, null);
        Node ptr = start;
        pos = pos - 1;
        for (int i = 1; i <
size; i++) {
           
if (i == pos) {
               
Node tmp = ptr.getLink();
               
ptr.setLink(nptr);
               
nptr.setLink(tmp);
               
break;
           
}
           
ptr = ptr.getLink();
        }
        size++;
    }
    public void deleteAtPos(int pos) {
        if (pos == 1) {
           
start = start.getLink();
           
size--;
           
return;
        }
        if (pos == size) {
           
Node s = start;
           
Node t = start;
           
while (s != end) {
               
t = s;
               
s = s.getLink();
           
}
           
end = t;
           
end.setLink(null);
           
size--;
           
return;
        }
        Node ptr = start;
        pos = pos - 1;
        for (int i = 1; i <
size - 1; i++) {
           
if (i == pos) {
               
Node tmp = ptr.getLink();
               
tmp = tmp.getLink();
               
ptr.setLink(tmp);
               
break;
           
}
           
ptr = ptr.getLink();
        }
        size--;
    }
    public void display() {
       
System.out.print("\nSingly Linked List = ");
        if (size == 0) {
           
System.out.print("empty\n");
           
return;
        }
        if (start.getLink() ==
null) {
           
System.out.println(start.getData());
           
return;
        }
        Node ptr = start;
       
System.out.print(start.getData() + "->");
        ptr =
start.getLink();
        while (ptr.getLink() !=
null) {
           
System.out.print(ptr.getData() + "->");
           
ptr = ptr.getLink();
}
System.out.print(ptr.getData() + "\n");
}
    // This method will make the linked
list in ascending order
    void ascending() {
        Node ptr = start, next =
null;
        int
tempData;   // to store temp data during
operation
        // if list is
not empty
        if (!isEmpty()) {
           
// keep looping until ptr becomes null,
           
// means until whole list is iterated
           
while (ptr != null) {
               
// next link
               
next = ptr.getLink();
               
// keep looping until next ptr becomes null
               
while (next != null) {
                   
// if current node data is greater than next, swap the nodes
                   
if (ptr.getData() > next.getData()) {
                       
tempData = ptr.getData();
                       
ptr.setData(next.getData());
                       
next.setData(tempData);
                   
}
                   
// move next to next position
                   
next = next.getLink();
               
}
               
ptr = ptr.getLink();
           
}
        }
    }
}
/* Class SinglyLinkedList */
public class SinglyLinkedList {
    public static void main(String[] args)
{
        Scanner scan = new
Scanner(System.in);
        /* Creating object of
class linkedList */
        linkedList list = new
linkedList();
System.out.println("Singly Linked List Test\n");
char ch;
        /* Perform list
operations */
        do {
           
System.out.println("\nSingly Linked List Operations\n");
           
System.out.println("1. insert at begining");
           
System.out.println("2. insert at end");
           
System.out.println("3. insert at position");
           
System.out.println("4. delete at position");
           
System.out.println("5. check empty");
           
System.out.println("6. get size");
           
System.out.println("7. linked list in ascending
order");
int choice = scan.nextInt();
           
switch (choice) {
               
case 1:
                   
System.out.println("Enter integer element to insert");
                   
list.insertAtStart(scan.nextInt());
                   
break;
               
case 2:
                   
System.out.println("Enter integer element to insert");
                   
list.insertAtEnd(scan.nextInt());
                   
break;
               
case 3:
                   
System.out.println("Enter integer element to insert");
                   
int num = scan.nextInt();
                   
System.out.println("Enter position");
                   
int pos = scan.nextInt();
                   
if (pos <= 1 || pos > list.getSize()) {
                       
System.out.println("Invalid position\n");
                   
} else {
                       
list.insertAtPos(num, pos);
                   
}
                   
break;
               
case 4:
                   
System.out.println("Enter position");
                   
int p = scan.nextInt();
                   
if (p < 1 || p > list.getSize()) {
                       
System.out.println("Invalid position\n");
                   
} else {
                       
list.deleteAtPos(p);
                   
}
                   
break;
               
case 5:
                   
System.out.println("Empty status = " + list.isEmpty());
                   
break;
               
case 6:
                   
System.out.println("Size = " + list.getSize() + " \n");
                   
break;
               
case 7:
                   
list.ascending();
                   
break;
               
default:
                   
System.out.println("Wrong Entry \n ");
                   
break;
           
}
           
/* Display List */
           
list.display();
           
System.out.println("\nDo you want to continue (Type y or n)
\n");
           
ch = scan.next().charAt(0);
        } while (ch == 'Y' ||
ch == 'y');
    }
}
Below is the sample output:

This completes the requirement. Let me know if you have any questions.
Thanks!