JAVA数据结构LinkedListSinglyCircular(单向循环链表)以及约瑟夫环的实现

package p02.动态链表;

import p01.动态数组.List;

public class LinkedListSinglyCircular<E> implements List<E>{
//单向循环链表
	private Node head;	//头指针
	private Node rear;	//尾指针
	private int size;	//元素个数
	public LinkedListSinglyCircular(){
		head=new Node();	//创建虚拟头结点
		head.next=head;
		rear=head;
		size=0;
	}
	private class Node{
		E data;
		Node next;
		public Node(){
			this(null,null);
		}
		public Node(E data){
			this(data,null);
		}
		public Node(E data,Node next){
			this.data=data;
			this.next=next;
		}
	}
	@Override
	public int getSize() {
		// TODO 自动生成的方法存根
		return size;
	}
	@Override
	public boolean isEmpty() {
		// TODO 自动生成的方法存根
		return size==0;
	}
	@Override
	public void add(int index, E e) {
		// TODO 自动生成的方法存根
		if(index<0||index>size){
			throw new IllegalArgumentException("角标非法");
		}
		Node n=new Node(e);
		if(index==0){//头插
			n.next=head.next;
			head.next=n;
			if(isEmpty()){
				rear=n;
				rear.next=rear;
			}else{
				rear.next=head.next;
			}
		}else if(index==size){//尾插
			n.next=rear.next;
			rear.next=n;
			rear=n;
		}else{//中间插
			Node p=head;
			for(int i=0;i<index;i++){
				p=p.next;
			}
			n.next=p.next;
			p.next=n;
		}
		size++;
	}
	@Override
	public void addFrist(E e) {
		// TODO 自动生成的方法存根
		add(0, e);
	}
	@Override
	public void addLast(E e) {
		// TODO 自动生成的方法存根
		add(size, e);
	}
	@Override
	public E get(int index) {
		if(isEmpty()){
			throw new IllegalArgumentException("链表为空");
		}
		int aimIndex=0;
		if(index<0){
			aimIndex=size+index%size+1;
		}else{
			aimIndex=index%size;
		}
		Node p=head;
		for(int i=0;i<aimIndex;i++){
			p=p.next;
		}
		return p.data;
	}
	@Override
	public E getFrist() {
		return head.next.data;
	}
	@Override
	public E getLast() {
		// TODO 自动生成的方法存根
		return rear.data;
	}
	@Override
	public E remove(int index) {
		// TODO 自动生成的方法存根
		if(index<0||index>=size){
			throw new IllegalArgumentException("角标异常");
		}
		E res=null;
		if(index==0){//删头
			Node n=head.next;
			res=n.data;
			head.next=n.next;
			n=null;
			if(size==1){
				rear=head;
				head.next=head;
			}else{
				rear.next=head.next;
			}
		}else if(index==size-1){//删尾
			res=rear.data;
			Node p=head;
			while(p!=rear){
				p=p.next;
			}
			p.next=rear.next;
			rear=p;
		}else{//删中间
			Node p=head;
			for(int i=0;i<index;i++){
				p=p.next;
			}
			Node n=p.next;
			res=n.data;
			p.next=n.next;
			n=null;
		}
		size--;
		return res;
	}
	@Override
	public E removeFrist() {
		// TODO 自动生成的方法存根
		return remove(0);
	}
	@Override
	public E removeLast() {
		// TODO 自动生成的方法存根
		return remove(size-1);
	}
	@Override
	public void set(int index, E e) {
		// TODO 自动生成的方法存根
		if(index<0||index>=size){
			throw new IllegalArgumentException("角标越界");
		}
		Node p=head;
		for(int i=0;i<=index;i++){
			p=p.next;
		}
		p.data=e;
	}
	@Override
	public boolean contains(E e) {
		// TODO 自动生成的方法存根
		return find(e)!=-1;
	}
	@Override
	public int find(E e) {
		// TODO 自动生成的方法存根
		if(isEmpty()){
			return -1;
		}
		int index=-1;
		Node p=head;
		while(p.next!=null){
			index++;
			p=p.next;
			if(p.data.equals(e)){
				return index;
			}
		}
		return -1;
	}
	@Override
	public void removeElement(E e) {
		// TODO 自动生成的方法存根
		int index=find(e);
		if(index!=-1){
			remove(index);
		}
	}
	@Override
	public void clear() {
		// TODO 自动生成的方法存根
		head.next=null;
		rear=head;
		size=0;
	}
	@Override
	public String toString() {
		StringBuilder sb=new StringBuilder();
		if(isEmpty()){
			return "[]";
		}else{
			sb.append("[");
			Node p=head;
			while(true){
				p=p.next;
				if(p==rear){
					sb.append(p.data+"]");
					break;
				}else{
					sb.append(p.data+",");
				}
			}
		}
		return sb.toString();
	}
	
	public LinkedList<Integer> Joseph(){//约瑟夫环
		LinkedList<Integer> list=new LinkedList<Integer>();
		Node p=head;
		while(size>0){
			p=p.next.next;
			Node n=p.next;
			p.next=p.next.next;
			list.addLast((Integer) n.data);
			size--;
		}
		return list;
	}
}

猜你喜欢

转载自blog.csdn.net/sl1130398099/article/details/88918085