JAVA数据结构LinkedListDoubleCircular(双向循环链表)

package p02.动态链表;

import java.util.Arrays;

import p01.动态数组.List;
public class LinkedListDoubleCircular<E> implements List<E>{ 
	private Node head;	//头指针
	private Node rear;	//尾指针
	private int size;	//元素个数
	
	public LinkedListDoubleCircular(){
		head=new Node();	//创建虚拟头结点
		head.next=head;
		head.pre=head;
		rear=head;
		size=0;
	}
	
	public class Node{
		E data;
		Node pre;
		Node next;
		public Node(){
			this(null,null,null);
		}
		public Node(E data){
			this(data,null,null);
		}
		public Node(E data,Node pre,Node next){
			this.data=data;
			this.pre=pre;
			this.next=next;
		}
	}

	@Override
	public int getSize() {
		
		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){
			if(isEmpty()){
				//尾插
				n.next=rear.next;
				rear.next=n;
				n.pre=rear;
				rear=n;
				head.pre=rear;
			}else{
				//头插
				head.next.pre=n;
				n.next=head.next;
				n.pre=head;
				head.next=n;
			}
		}else if(index==size){
			//尾插
			n.next=rear.next;
			rear.next=n;
			n.pre=rear;
			rear=n;
			head.pre=rear;
		}else{
			Node p=head;
			for(int i=0;i<index;i++){
				p=p.next;
			}
			p.next.pre=n;
			n.next=p.next;
			n.pre=p;
			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) {
		Node p=head;
		for(int i=0;i<=index;i++){
			p=p.next;
		}
		return p.data;
	}

	@Override
	public E getFrist() {
		
		return get(0);
	}

	@Override
	public E getLast() {
		// TODO 自动生成的方法存根
		return get(size-1);
	}

	@Override
	public E remove(int index) {
		if(index<0||index>=size){
			throw new IllegalArgumentException("角标异常");
		}
		if(size==0){
			return null;
		}
		E res=null;
		if(index==0){//删头
			Node n=head.next;
			if(size==1){//最后一个
				res=n.data;
				n=null;
				head.next=head;
				head.pre=head;
				rear=head;
			}else{
				n.next.pre=head;
				head.next=n.next;
				res=n.data;
			}
		}else if(index==size-1){//删尾
			Node n=rear;
			rear.pre.next=rear.next;
			rear.next.pre=rear.pre;
			rear=rear.pre;
			res=rear.data;
		}else{//删中间
			Node p=head;
			for(int i=0;i<index;i++){
				p=p.next;
			}
			Node n=p.next;
			n.next.pre=p;
			p.next=n.next;
			res=n.data;
		}
		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) {
		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) {
//		return find(e)!=-1;
		return find(e)==-1?false:true;
	}

	@Override
	public int find(E e) {
		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) {
		
		int index=find(e);
		if(index!=-1){
			System.out.println(index);
			remove(index);
		}
	}

	@Override
	public void clear() {
		head.next=head;
		head.pre=head;
		rear=head;
		size=0;
	}
	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();
	}
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值