参考JDK链表的写法实现的,写的挺简单的,没有优化,将就看下,一起学习!
package com.zzp.securingweb;
import java.util.NoSuchElementException;
public class YuesefuMain {
public static void main(String[] args) {
MyList<Integer> myList = new MyList<>();
for(int i=1;i<=7;i++){
myList.add(i);
}
myList.kill(2,5);
System.out.println("size "+myList.size());
for(int i=0;i<myList.size();i++){
System.out.println(myList.get(i));
}
}
}
class MyList<E>{
transient MyNode<E> first;
transient MyNode<E> last;
transient int size=0;
public void add(E e){
if(first==null){
first = new MyNode<E>(e,null,null);
last = first;
}else{
final MyNode<E> prelast = last;
final MyNode<E> newLast = new MyNode<E>(e,prelast,first);
if(prelast.pre == null){
prelast.pre = first;
}
if(first.next==null){
first.next = newLast;
}
first.pre = newLast;
prelast.next = newLast;
last = newLast;
}
size++;
}
public void kill(int killIndex,int left){
if(killIndex==0){
throw new NoSuchElementException();
}
if(size==0){
throw new NoSuchElementException();
}
if(left<0 || left>size){
throw new NoSuchElementException();
}
if(left==size)
return;
int index = killIndex%size;
if (index==0)
index = size;
while(true){
remove(index-1);
index = killIndex%size;
if (index==0)
index = size;
if(size<=left)
break;
}
}
public int size(){
return size;
}
public E get(int index){
if(index<0 || index>=size){
return null;
}
MyNode<E> target=first;
if(index==0){
return target.item;
}
for(int i=1;i<size;i++){
target = target.next;
if(i==index){
return target.item;
}
}
return null;
}
private void remove(int index){
if(index<0 || index>=size){
throw new NoSuchElementException();
}
MyNode<E> target=first;
if(index==0){
final MyNode<E> newFirst = target.next;
first = newFirst;
newFirst.pre = last;
}else{
for(int i=1;i<size;i++){
target = target.next;
if(i==index){
final MyNode<E> pre = target.pre;
final MyNode<E> next = target.next;
pre.next = next;
next.pre = pre;
first = next;
last = pre;
break;
}
}
}
if(target!=null){
target.pre=null;
target.next=null;
target.item = null;
}
size--;
}
}
class MyNode<E> {
E item;
MyNode<E> next;
MyNode<E> pre;
MyNode(E element, MyNode<E> pre, MyNode<E> next) {
this.item = element;
this.next = next;
this.pre = pre;
}
}