Source of LinkedList.java


  1: //LinkedList.java

  3: class Node
  4: {
  5:     public int data;
  6:     public Node next;

  8:     public Node(int initialData)
  9:     {
 10:         data = initialData;
 11:         next = null;
 12:     }
 13: }

 15: class LinkedList
 16: {
 17:     private Node head;
 18:     private Node tail;

 20:     public LinkedList()
 21:     {
 22:         head = null;
 23:         tail = null;
 24:     }

 26:     public void append(Node newNode)
 27:     {
 28:         if (head == null)
 29:         {
 30:             head = newNode;
 31:             tail = newNode;
 32:         }
 33:         else
 34:         {
 35:             tail.next = newNode;
 36:             tail = newNode;
 37:         }
 38:     }

 40:     public void prepend(Node newNode)
 41:     {
 42:         if (head == null)
 43:         {
 44:             head = newNode;
 45:             tail = newNode;
 46:         }
 47:         else
 48:         {
 49:             newNode.next = head;
 50:             head = newNode;
 51:         }
 52:     }

 54:     public void printList()
 55:     {
 56:         Node node = head;
 57:         while (node != null)
 58:         {
 59:             System.out.print(node.data + " ");
 60:             node = node.next;
 61:         }
 62:         System.out.println();
 63:     }

 65:     public void insertAfter
 66:     (
 67:         Node currentNode,
 68:         Node newNode
 69:     )
 70:     {
 71:         if (head == null)
 72:         {
 73:             head = newNode;
 74:             tail = newNode;
 75:         }
 76:         else if (currentNode == tail)
 77:         {
 78:             tail.next = newNode;
 79:             tail = newNode;
 80:         }
 81:         else
 82:         {
 83:             newNode.next = currentNode.next;
 84:             currentNode.next = newNode;
 85:         }
 86:     }

 88:     public void removeAfter(Node currentNode)
 89:     {
 90:         if (currentNode == null && head != null)
 91:         {
 92:             // Special case: remove head
 93:             Node succeedingNode = head.next;
 94:             head = succeedingNode;
 95:             if (succeedingNode == null)
 96:             {
 97:                 // Last item was removed
 98:                 tail = null;
 99:             }
100:         }
101:         else if (currentNode.next != null)
102:         {
103:             Node succeedingNode = currentNode.next.next;
104:             currentNode.next = succeedingNode;
105:             if (succeedingNode == null)
106:             {
107:                 // Remove tail
108:                 tail = currentNode;
109:             }
110:         }
111:     }

113:     public void insertionSortSinglyLinked()
114:     {
115:         Node beforeCurrent = head;
116:         Node currentNode = head.next;
117:         while (currentNode != null)
118:         {
119:             Node nextNode = currentNode.next;
120:             Node position = findInsertionPosition(currentNode.data);
121:             if (position == beforeCurrent)
122:                 beforeCurrent = currentNode;
123:             else
124:             {
125:                 removeAfter(beforeCurrent);
126:                 if (position == null)
127:                     prepend(currentNode);
128:                 else
129:                     insertAfter(position, currentNode);
130:             }
131:             currentNode = nextNode;
132:         }
133:     }

135:     public Node findInsertionPosition(int dataValue)
136:     {
137:         Node positionA = null;
138:         Node positionB = head;
139:         while (positionB != null && dataValue > positionB.data)
140:         {
141:             positionA = positionB;
142:             positionB = positionB.next;
143:         }
144:         return positionA;
145:     }

147:     // Added for Stack/Queue section
148:     public int getHeadData()
149:     {
150:         return head.data;
151:     }
152: }