public
class
SingleLinkedList<E> {
private
class
Node<T> {
private
T data;
private
Node<T> next;
public
Node(T data) {
this
.data = data;
this
.next =
null
;
}
@Override
public
String toString() {
return
String.valueOf(data);
}
}
private
Node<E> head =
null
;
private
int
size =
0
;
private
Node<E> tail =
null
;
public
String toString() {
if
(head ==
null
){
return
"[]"
;
}
Node<E> temp = head;
String str =
"["
;
while
(temp.next !=
null
){
str += temp.data +
","
;
temp = temp.next;
}
str += temp.data;
return
str+
"]"
;
}
private
void
addFirst(E input){
Node<E> newNode =
new
Node<>(input);
newNode.next = head;
head = newNode;
size++;
if
(head.next ==
null
){
tail = head;
}
}
private
void
addLast(E input){
Node<E> newNode =
new
Node<>(input);
if
(size ==
0
){
addFirst(input);
}
else
{
tail.next = newNode;
tail = newNode;
size++;
}
}
public
void
add(E input){
addLast(input);
}
public
void
add(
int
index, E input){
if
(index ==
0
){
addFirst(input);
}
else
if
(index == size) {
addLast(input);
}
else
if
(index > size || index <
0
) {
throw
new
IndexOutOfBoundsException(String.valueOf(index));
}
else
{
Node<E> prev = head;
for
(
int
i=
0
; i<index-
1
; i++) {
prev = prev.next;
}
Node<E> newNode =
new
Node<>(input);
newNode.next = prev.next;
prev.next = newNode;
size++;
}
}
public
E removeFirst(){
Node<E> temp = head;
head = temp.next;
E data = temp.data;
temp =
null
;
size--;
return
data;
}
public
E remove(
int
index){
if
(index ==
0
) {
return
removeFirst();
}
else
if
(index >= size || index <
0
) {
throw
new
IndexOutOfBoundsException(String.valueOf(index));
}
Node<E> prev = head;
for
(
int
i=
0
; i<index-
1
; i++) {
prev = prev.next;
}
Node<E> todoDeleted = prev.next;
prev.next = prev.next.next;
E returnData = todoDeleted.data;
if
(todoDeleted == tail){
tail = prev;
}
todoDeleted =
null
;
size--;
return
returnData;
}
public
E get(
int
index){
if
(index <
0
|| index >= size) {
throw
new
IndexOutOfBoundsException(String.valueOf(index));
}
Node<E> temp = head;
for
(
int
i=
0
; i<index; i++) {
temp = temp.next;
}
return
temp.data;
}
public
int
size() {
return
size;
}
public
int
indexOf(E data){
Node<E> temp = head;
int
index =
0
;
while
( (temp.data != data) && (!temp.data.equals(data)) ){
temp = temp.next;
index++;
if
(temp ==
null
) {
return
-
1
;
}
}
return
index;
}
public
Object[] toArray() {
Object[] listArray =
new
Object[size];
for
(
int
i=
0
; i<size; i++) {
listArray[i] = get(i);
}
return
listArray;
}
public
E[] toArray(E[] e) {
E[] listArray = e;
for
(
int
i=
0
; i<size; i++) {
listArray[i] = get(i);
}
return
listArray;
}
public
static
void
main(String[] args) {
SingleLinkedList<String> list =
new
SingleLinkedList<String>();
System.out.println(list);
list.add(
"A"
); System.out.println(list);
list.add(
"B"
);
list.add(
"D"
); System.out.println(list);
list.add(
2
,
"F"
); System.out.println(list);
list.removeFirst(); System.out.println(list);
list.remove(
1
); System.out.println(list);
list.add(
"C"
);
list.add(
"E"
); System.out.println(list);
System.out.println(list.get(
0
));
System.out.println(list.get(
1
));
System.out.println(list.get(
2
));
System.out.println(list.get(
3
));
System.out.println(list.indexOf(
"A"
));
System.out.println(list.indexOf(
"C"
));
System.out.println(list.indexOf(
new
String(
"C"
)));
String[] strArray = list.toArray(
new
String[list.size]);
for
(String data : strArray) {
System.out.print(data +
" "
);
}
System.out.println();
}
}