栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【根据底层源码,自定义双向链表LinkedList】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【根据底层源码,自定义双向链表LinkedList】

public class MyLinkedList{
	//头结点
	private Node first;//null
	//尾结点
	private Node last;//null
	//统计结点个数
	private int size;//0
	
	
	public void add(E item) {
		//根据传入内容创建新结点
		Node newNode=new Node(item);
		if(first==null) {//空链表
			//新结点既是头结点也是尾结点
			first=newNode;
			last=newNode;
			
		}else {//非空链表
			//尾结点的后驱指针指向新结点
			last.next=newNode;
			//新结点的前驱指针指向尾结点
			newNode.prev=last;
			//新结点变成链表的尾结点
			last=newNode;
		}
		//计数加1
		size++;
 	}
	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder("[");
		//从头结点开始逐个向后遍历
		Node node=first;
		while(node!=null) {
			//获取结点内容
			E e=node.item;
			//拼接结点内容
			sb.append(e+",");
			//获取下一个结点
			node=node.next;
		}
		sb.setCharAt(sb.length()-1,']');
		return sb.toString();
	}

	
	
	public int size() {
		return size;
	}
	
	
	public Node getNode(int index){
		//判断下标
		if(index<0 ||index>=size) {
			throw new IndexOutOfBoundsException("查找不到");
		}
		Node node;
		if(index node=first;
		if(e==null) {
			for(int i=0;i node=first;
		for(int i=0;i next=node.next;
			//再将当前结点的前驱指针,后驱指针,结点内容置为null
			node.prev=null;
			node.next=null;
			node.item=null;
			//切换到下一个结点
			node=next;
		}
		first=last=null;
		//计数归0
		size=0;
	}
	
	
	
	public void add(int index,E e) {
		//判断下标
				if(index<0 ||index>=size) {
					throw new IndexOutOfBoundsException("查找不到");
				}
		//根据传入的内容构建新结点、
		Node newNode=new Node(e);
		
		//如果插入是头结点
		if(index==0) {
			//头结点的前驱指针指向新结点
			first.prev=newNode;
			//新结点的后去指针指向头结点
			newNode.next=first;
			//再将新结点变为头结点
			first=newNode;
			size++;
		}else if(index==size){//插入是尾结点
			add(e);
		}else {//插入是中间
			//获取上一个结点
			Node prevNode=getNode(index-1);
			//获取下一个结点
			Node nextNode=getNode(index);
			//上一个结点的后驱指针指向新结点
			prevNode.next=newNode;
			//下一个节点的前驱指针指向新结点
			nextNode.prev=newNode;
			//新结点的前驱指针指向上一个结点
			newNode.prev=prevNode;
			//新结点的后驱指针指向下一个结点
			newNode.next=nextNode;
			size++;
		}
	}
	
	
	
	public void remove(int index){
		//判断下标
		if (index < 0 || index >= size) {
			throw new IndexOutOfBoundsException("查找不到");
		}
		//如果链表中只有一个结点
		if(first==last) {
			first=null;
			//该节点没有前驱后驱和内容
			//但是该结点依然存在在链表上
			//所以从链表移除该结点
			first=last=null;
			size=0;
			return;
		}
		
		// 如果删除是头结点
		if (index == 0) {
			Node node = first;
			Node secondNode = first.next;
			// 头结点后驱指针为null
			first.next = null;
			// 下一个结点前驱指针为null
			secondNode.prev=null;
			//清空头结点
			first.item=null;
			// 下一个结点变为头指针
			first = secondNode;
		} else if (index == size-1) {// 删除是尾结点
			// 获得尾结点的上一个结点
			Node lastSecondNode = last.prev;
			lastSecondNode.next = null;
			//尾结点前驱为null
			last.prev = null;
			//清空尾结点
			last.item=null;
			last = lastSecondNode;
		}else {//删除中间结点
			
			Node currentnode = getNode(index);
			//获取上一个结点
			Node prevNode=getNode(index-1);
			//获取下一个结点
			Node nextNode=getNode(index+1);
			
			prevNode.next=nextNode;
			nextNode.prev=prevNode;	
			currentnode.next=null;
			currentnode.prev=null;
			currentnode.item=null;
		}
		size--;
	}
	
	
	public boolean remove(E e) {
		//根据内容查找结点下标
		int index=indexOf(e);
		if(index==-1) {//内容不存在
			return false;
			
		}
		//根据下标删除结点
		remove(index);
		return true;
	}
	
	
	public boolean contains(E e) {
		return indexOf(e)>0;
	}
	
	public E set(int index,E e) {
		//判断下标
		if(index<0 ||index>=size) {
			throw new IndexOutOfBoundsException("查找不到");
		}
	//根据下标查找原来结点内容
		E oldValue =get(index);
		//根据下标查找结点
		Node node=getNode(index);
		//替换内容
		node.item=e;
		return oldValue;
	}
	
	public static void main(String[] args) {
		MyLinkedList list=new MyLinkedList();
		list.add("aaa");
		list.add("bbb");
		list.add("ccc");
		list.add("ddd");
		list.add("eee");
		list.add("fff");
		
		
		System.out.println(list.size);
		System.out.println(list);
//		
		list.add(5,"PPP");
//		list.remove("ccc");
//		System.out.println(list.size);
		System.out.println(list);
//		
//		System.out.println(list.get(0));
//		System.out.println(list.get(1));
//		System.out.println(list.get(2));
//		System.out.println(list.get(3));
//		System.out.println(list.get(4));
//		
//		System.out.println(list.indexOf(null));
//		System.out.println(list.indexOf("aaa"));
//		System.out.println(list.indexOf("bbb"));
//		System.out.println(list.indexOf("ddd"));
//		System.out.println(list.indexOf("fff"));
//		System.out.println(list.indexOf("aaa"));
//		System.out.println(list.indexOf("ccc"));
		
//		System.out.println(list.isEmpty());
//		list.clear();
//		System.out.println(list.isEmpty());
//
//		System.out.println(list.first);
//		System.out.println(list.last);
		
	}
	
	private static class Node{
		//结点内容部分
		private E item;
		 //前驱指针
		private Node prev;
		//后驱指针
		private Node next;

		public Node(E item, Node prew, Node next) {
			super();
			this.item = item;
			this.prev = prev;
			this.next = next;
		}

		public Node(E item) {
			this.item = item;
		}
		
		
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1039527.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号