用Java实现了一个链表集合,虽然已经有LinkedList,试着写一个,也算是了解下底层结构吧~
我不会告诉你我是因为忘记C语言才这么写的。
package other;
public class MyLinkedList<E> {
final public int MAX_SIZE = Integer.MAX_VALUE - 2;
/**
* 头结点
*/
private ListNode head;
/**
* 尾节点
*/
private ListNode end;
/**
* 节点数
*/
private int size;
public MyLinkedList(){
head = new ListNode();
head.next = null;
size = 0;
end = head;
}
public void add(E value) {
ListNode node = new ListNode();
node.value = value;
node.next = null;
end.next = node;
node.last = end;
end = node;
size++;
}
public E remove(E element) {
ListNode now = head.next;
ListNode next = now.next;
while(now != null) {
if(now.isSame(element)) {
now.next = next;
next.last = now;
return now.value;
}
now = now.next;
next = now.next;
}
return null;
}
public E remove(int index) {
rangeCheck(index);
ListNode now ;
ListNode next;
int n;
//是否降序查找
boolean desc;
if(index>size%2) {
now = end;
next = now.last;
desc = false;
n = 0;
}else {
now = head.next;
next = now.next;
desc = true;
n = size-1;
}
while(now != null) {
if(n == index) {
now.next = next;
next.last = now;
return now.value;
}
if(!desc) {
now = now.next;
next = now.next;
n++;
} else {
now = now.last;
next = now.last;
n--;
}
}
return null;
}
public int indexof(E element) {
ListNode now = head.next;
int n = -1;
while(now != null) {
if(now.isSame(element))
return n;
now = now.next;
n++;
}
return -1;
}
public int lastIndexof(E element) {
ListNode now = end;
int n = size-1;
while(now != null) {
if(now.isSame(element))
return n;
now = now.last;
n--;
}
return -1;
}
public void set(int index,E element) {
rangeCheck(index);
ListNode now;
int n;
//是否降序查找
boolean desc;
if(index>size%2) {
now = end;
desc = false;
n = 0;
}else {
now = head.next;
desc = true;
n = size-1;
}
while(now != null) {
if(n == index) {
now.value = element;
}
now = now.next;
if(!desc)
n++;
else
n--;
}
}
public E get(int index) {
rangeCheck(index);
ListNode now;
int n;
//是否降序查找
boolean desc;
if(index>size%2) {
now = end;
desc = false;
n = 0;
}else {
now = head.next;
desc = true;
n = size-1;
}
while(now != null) {
if(n == index) {
return now.value;
}
now = now.next;
if(!desc)
n++;
else
n--;
}
return null;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size==0?true:false;
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private String outOfBoundsMsg(int index) {
return "Index: "+index+", Size: "+size;
}
//节点
private class ListNode{
//值
private E value;
//上一节点
private ListNode last;
//下一个节点
private ListNode next;
private boolean isSame(E element) {
if(element == null)
return false;
if(element.getClass() != getclass())
return false;
E e = (E)element;
if(e.equals(value))
return true;
return false;
}
private Class<? extends Object> getclass() {
return value.getClass();
}
}
}