java实现双向链表

4 篇文章 0 订阅
2 篇文章 0 订阅

在以下的代码中,为了更加方便的插入,删除,以及提高效率,我将双端链表和双向链表结合了起来,代码如下:

package lianBiao;
/**
 * 有头指针
 * @author acer
 *
 */
public class DoubleLinkList {
	public static void main(String[] args) {
		DoubleLinkList list=new DoubleLinkList();
		list.addLast("aa");
		list.addLast("aa");
		list.addLast("bb");
		list.addLast("bb");
		
//		System.out.println(list.remove(0));
//		System.out.println(list.remove(1));
//		System.out.println(list.remove(2));
		System.out.println(list.remove(3));
		System.out.println(list.remove(4));
//		System.out.println(list.removeFirst());
//		System.out.println(list.removeFirst());
//		System.out.println(list.removeFirst());
//		System.out.println(list.removeFirst());
//		System.out.println(list.removeLast());
//		System.out.println(list.removeLast());
//		System.out.println(list.removeLast());
//		System.out.println(list.removeLast());
//		list.clear1();
		System.out.println("------");
		System.out.println(list.size());
		list.displayList();
	}
	private Link head;
	private Link last;
	public String remove(int index){
		
		if(index<0){
			return "index不能为负数";
		}else if(index==0){
			return removeFirst();
		}else{
			Link current=head;
			int i=0;
			while(current!=null && i<index){
				current=current.next;
				i++;
			}
			if(current==null){
				return "index值过大";
			}else if(current!=null&¤t.next==null){
				return removeLast();
			}else{
				String data=current.data;
				current.previous.next=current.next;
				return data;
			}
		}
	}
	public String removeFirst(){
		if(head!=null&&head.next!=null){
			Link firstLink=getFirstLink();
			String data=firstLink.data;
			firstLink.next.previous=firstLink.previous;
			head=firstLink.next;
			return data;
		}else if(head!=null&&head.next==null){
			Link firstLink=getFirstLink();
			String data=firstLink.data;
			head=null;
			last=null;
			return data;
		}
		return null;
	}
	public String removeLast(){
		Link current=head;
		if(current!=null&¤t.next!=null){
			Link lastLink=getLastLink();
			String data=lastLink.data;
			lastLink.previous.next=lastLink.next;
			last=lastLink.previous;
			return data;
		}else if(current!=null &¤t.next==null){
			String data=current.data;
			head=null;
			last=null;
			return data;
		}
		return null;
	}
	//第一种方法,用删除头节点的方法
	public void clear(){
		Link current=head;
		while(current!=null){
			removeFirst();
			current=current.next;
		}
	}
	//第二种方法,用删除尾节点的方法
	public void clear1(){
		Link current=last;
		while(current!=null){
			removeLast();
			current=current.previous;
		}
	}
	
	public DoubleLinkList(){
		head=null;
		last=null;
	}
	public void addLast(String data){
		Link newLink=new Link(data);
		if(head==null){
			last=newLink;
			head=newLink;
		}else{
			Link temp=last;
			temp.next=newLink;
			newLink.previous=temp;
			last=newLink;
			
			
		}
	}
	public void displayList(){
		Link current=head;
		while(current!=null){
			current.displayLink();
			current=current.next;
		}
	}
	public void addFirst(String data){
		Link newLink=new Link(data);
		if(head==null){
			last=newLink;
			head=newLink;
		}else{
			Link temp=head;
			newLink.previous=temp;
			newLink.next=temp;
			temp.previous=newLink;
			head=newLink;
			
		}
	}
	public void add(int index,String data){
		if(index<0){
			System.out.println("index 不能为负数");
		}else if(index==0){
			addFirst(data);
		}else{
			Link current=head;
			int i=0;
			while(current!=null&&i<index-1){
				current=current.next;
				i++;
			}
			if(current==null){
				System.out.println("index过大");
			}else if(current.next==null){
				addLast(data);
			}else{
				Link newlLink=new Link(data);
				newlLink.next=current.next;
				newlLink.previous=current;
				current.next.previous=newlLink;
				current.next=newlLink;
			}
		}

	}
	public boolean isEmpty(){
		return head==null;
	}
	public void addLastAll(DoubleLinkList newList){//如何在不新建一个链表的基础上将两个链表连起来??
			Link newFirst=newList.getFirstLink();
			Link newLast=newList.getLastLink();
			//将newFirst添加到原链表的尾部
			last.next=newFirst;
			newFirst.previous=last;
			//改变last的指向
			last=newLast;
//			Link current=newList.head;
//			Link temp=current;
//			while(current!=null){
//				Link last=this.last;
//				last.next=temp;
//				temp.previous=last;
//				last=temp;
//				current=current.next;
//			
//		}
	}
	public void addFirstAll(DoubleLinkList newList){
		
	}
	public Link getFirstLink(){
		return head;
	}
	public Link getLastLink(){
		return last;
	}
	public boolean contains(String data){
		if(data==null){
			return false;
		}
		Link current=head;
		while(current!=null){
			if(current.data.equals(data)){
				return true;
			}else{
				current=current.next;
			}
		}
		return false;
	}
	public String element(){//返回第一个元素的值
		if(head==null){
			return null;
		}
		return head.data;
	}
	public String get(int index){
		if(index<0 ||index>size()){
			return null;
		}else{
			int i=0;
			Link current=head;
			while(current!=null&&i<index){
				current=current.next;
				i++;
			}
			return current.data;
		}
		
	}
	public String getFirst(){
		return element();
	}
	public String getLast(){
		if(head==null){
			return null;
		}
		return last.data;
	}
	public int indexOf(String data){
		int i=0;
		if(data==null){
			return -1;
		}else{
			Link current=head;
			while(current!=null){
				if(current.data.equals(data)){
					return i;
				}else{
					current=current.next;
					i++;
				}
			}
			if(current==null){
				return -1;
			}
		}
		return 0;
	}
	public int lastIndexOf(String data){
		int answer;
		if(data==null){
			return -1;
		}else{
			Link current=last;
			int index=size()-1;
			while(current!=null&&index>=0){
				if(current.data.equals(data)){
					return index;
				}else{
					index--;
					current=current.previous;
				}
			}
			if(index<0){
				return -1;
			}
		}
		return 0;
	}
	public int size() {
		Link current=head;
		int size=0;
		while(current!=null){
			current=current.next;
			size++;
		}
		return size;
	}
	class Link{
		Link previous;
		String data;
		Link next;
		 Link(String data){
			this.data=data;
		}
		 public void displayLink(){
			 System.out.println(data+" ");
		 }
	}

}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值