import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;

public class CircleLinkedList<T> extends LinkedList<T> implements Iterable<T> {

	private static final long serialVersionUID = 1L;

	@Override
	public Iterator<T> iterator() {
		// TODO Auto-generated method stub
		return new CircleIterator(this);
	}

	@Override
	public ListIterator<T> listIterator() {
		// TODO Auto-generated method stub
		return new CircleListIterator(this);
	}

	@Override
	public ListIterator<T> listIterator(int index) {
		// TODO Auto-generated method stub
		return new CircleListIterator(this, index);
	}

	private ListIterator<T> getListIterator(int index) {
		return super.listIterator(index);
	}

	private ListIterator<T> getListIterator() {
		return super.listIterator();
	}

	private Iterator<T> getIterator() {
		return super.iterator();
	}

	class CircleListIterator implements ListIterator<T> {
		CircleLinkedList<T> list;
		ListIterator<T> iter;

		public CircleListIterator(CircleLinkedList<T> list) {
			// TODO Auto-generated constructor stub
			this.list = list;
			iter = list.getListIterator();
		}

		public CircleListIterator(CircleLinkedList<T> list, int index) {
			// TODO Auto-generated constructor stub
			this.list = list;
			iter = list.getListIterator(index);
		}

		@Override
		public void add(T e) {
			iter.add(e);
		}

		@Override
		public boolean hasNext() {
			return list.size()>0;
		}

		@Override
		public boolean hasPrevious() {
			return list.size()>0;
		}

		@Override
		public T next() {
			if(iter.hasNext()){
				return iter.next();
			}else{
				iter=list.getListIterator();
			}
			return iter.next();
		}

		@Override
		public int nextIndex() {
			int nextindex = iter.nextIndex() + list.size();
			return nextindex % list.size();
		}

		@Override
		public T previous() {
			if(iter.hasPrevious()){
				return iter.previous();
			}else{
				iter=list.getListIterator(list.size());
			}
			return iter.previous();
		}

		@Override
		public int previousIndex() {
			int previndex = iter.previousIndex() + list.size();
			return previndex % list.size();
		}

		@Override
		public void remove() {
			iter.remove();

		}

		@Override
		public void set(T e) {
			iter.set(e);
		}

	}

	class CircleIterator implements Iterator<T> {
		Iterator<T> iter;
		CircleLinkedList<T> list;

		public CircleIterator(CircleLinkedList<T> list) {
			this.list = list;
			iter = list.getIterator();
		}

		@Override
		public boolean hasNext() {
			// TODO Auto-generated method stub
			return list.size() > 0;
		}

		@Override
		public T next() {
			// TODO Auto-generated method stub
			if (iter.hasNext()) {
				return iter.next();
			} else {
				iter = list.getIterator();
				return iter.next();
			}

		}

		@Override
		public void remove() {
			// TODO Auto-generated method stub
			iter.remove();

		}
	}
}
	

getFirst() 하면 head
getLast() 하면 tail

iterator 가져와서 next() 호출하면 무한히 돌아감 'ㅁ'

잘쓴다면 Josephus(조세푸스?) problem 도 풀수 잇게치?
진짜 푸는 알고리즘은 따로있지만 간단하게 구현할수 있다

긍데 테스트는 안해봤음
에러나도 난몰라

복사 하고 싶으면 맨윗줄에 마우스 올리면 오른쪽에 뭔가 나옴

근데 만들고 나니까 길다

'Programming > Java' 카테고리의 다른 글

'필드'이지만 '메서드'처럼 사용됩니다.  (2) 2012.01.03
"".equals ?  (0) 2011.12.21
java에서 DES/AES 사용법  (0) 2011.11.22
java 7 의 달라진점 몇가지  (0) 2011.09.26
JAVA 로 System Information 알아내기  (0) 2011.08.23
Posted by 동적할당
: