package tong.java.one;
/**
* 自定义LinkedList
*
* @author 仝闯
*
*/
public class MyLinkedList {
private Node head;
private int size;
// 默认在链表的结尾添加元素
public void add(Object o) {
Node newNode = new Node(o);
if (size == 0) {
head = newNode;
} else if (size == 1) {
Node oldHead = head;
head = newNode;
head.next = oldHead;
} else {
getNode(size - 1).next = newNode;
}
size++;
}
// 在指定索引出添加元素
public void add(int index, Object o) {
Node newNode = new Node(o);
if (size == 0) {
head = newNode;
} else if (size == 1) {
Node oldHead = head;
head = newNode;
head.next = oldHead;
} else {
if (index == 0) {
Node oldHead = head;
head = newNode;
head.next = oldHead;
} else if (index == size - 1) {
getNode(size - 1).next = newNode;
} else {
for (int i = 1; i < index; i++) {
getNode(index - 1).next = newNode;
newNode.next = getNode(index);
}
}
}
size++;
}
// 添加元素到首位
public void addFirst(Object o) {
Node oldHead = head;
head = new Node(o);
head.next = oldHead;
size++;
}
// 获取指定索引处的元素
public Object get(int index) {
return getNode(index).data;
}
private Node getNode(int index) {
Node x = head;
if (index == 0) {
return head;
} else {
for (int i = 0; i < index; i++) {
x = x.next;
}
return x;
}
}
// 删除指定索引处的元素
public Object remove(int index) {
if (index < 0 || index > size - 1) {
throw new RuntimeException();
} else {
if (0 < index && index < size - 1) {
getNode(index - 1).next = getNode(index + 1);
size--;
return getNode(index);
} else if (index == 0) {
Node removeNode = head;
removeNode.next = null;
head = getNode(1);
size--;
return removeNode;
} else {
getNode(index - 1).next = null;
size--;
return getNode(index);
}
}
}
// 删除首位元素
public Object removeFirst() {
return remove(0);
}
// 删除末位元素
public Object removeLast() {
return remove(size - 1);
}
public int size() {
return size;
}
class Node {
Object data;
Node next;
public Node(Object data) {
this.data = data;
}
}
}