手写基本容器——LinkedList(二)


底层实现

1、LinkedList的底层实现是通过定义像链表一样的结构
2、每个表的开始都是有一个first和last来记录我们的第一个和最后一个的value值的地址就可以,然后中间的部分我们可以使用“前一个”和“下一个”来遍历整个数组
3、我们可以将这个结构定义为一个Node,每次new一次都会产生这个节点,前后自动的连接,这样的化就会自动的形成一个链子的结构
4、我们将处理函数放在一个地方,在将Node放在另外的一个地方,代码变得简单

在这里插入图片描述

1、建立一个Node节点

public class Node {
	private Node Pr;
	private Node Ne;	
	Object element;
		
	public Node(Node pr, Node ne, Object element) {
		super();
		Pr = pr;
		Ne = ne;
		this.element = element;
	}
	public Node getPr() {
		return Pr;
	}
	public void setPr(Node pr) {
		Pr = pr;
	}
	public Node getNe() {
		return Ne;
	}
	public void setNe(Node ne) {
		Ne = ne;
	}
	public Object getElement() {
		return element;
	}
	public void setElement(Object element) {
		this.element = element;
	}
	public Node(Object element) {
		super();
		this.element = element;
	}
}

2、添加add和toString的方法

import myConlection.Node;

/***
 * 创建一个一个链表
 * 添加一些基本的方法
 * @author starwang
 *
 */
public class myLinkList1 {
	private Node first;
	private Node last;
	
	public void add(Object obj) {
		Node node = new Node(obj);
		if(first==null) {
			node.setNe(null);
			node.setPr(null);
			first = node;
			last = node;
			
		}else {
			//设置本节点往前一个节点进行跳转,设置下一个跳转的对象为null
			node.setPr(last);
			node.setNe(null);
			
			//设置上一个跳转的下一额对象为本对象
			last.setNe(node);
			last = node;	
		}	
	}
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		Node tmpe = first;
		while(tmpe!=null) {
			sb.append(tmpe.getElement()+",");
			tmpe =tmpe.getNe(); 	
		}
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
		}
	public static void main(String[] args) {
		myLinkList1 li = new myLinkList1();
		li.add("a");
		li.add("b");
		li.add("c");
		li.add("d");
		System.out.println(li);
	}
}

3、添加remove的功能

删除的时候只需要修改对应的连接就行

import myConlection.Node;


/***
 * 添加remove的功能
 * @author starwang
 *
 */
public class myLinkList2 {
	
	private Node first;
	private Node last;
	
	private int size;

	
	public void add(Object obj) {
		Node node = new Node(obj);
		if(first==null) {
			node.setNe(null);
			node.setPr(null);
			first = node;
			last = node;		
		}else {
			//设置本节点往前一个节点进行跳转,设置下一个跳转的对象为null
			node.setPr(last);
			node.setNe(null);
			
			//设置上一个跳转的下一额对象为本对象
			last.setNe(node);
			last = node;			
		}
		size++;
	}
	
	
	/***
	 * 获取这个元素
	 * @param index
	 * @return
	 */
	public Object getElement(int index) {
		if (index>(size-1)||index<-1) {
			throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
		}

		/**
		 *未优化的代码 
		 */
//		Node tmpe = first;
//		for (int i = 0; i < index; i++) {
//			tmpe = tmpe.getNe();
//		}
		
		/**
		 * 优化的代码,选着在哪里进行开始查询
		 */
		Node tmpe;
		int b = (size>>1);
		if(index<=b) {
			tmpe = first;
			for(int i=0;i<index;i++) {
				tmpe = tmpe.getNe();
			}
		}else {
			tmpe = last;
			for(int i=(size-1);i>index;i--) {
				tmpe = tmpe.getPr();
			}
		}
		return tmpe.getElement();
	}
	
	
	/***
	 * 获取指定位置的node
	 * @param index
	 * @return
	 */
	public Node getNode(int index ) {
		Node temp ;
		if (index>(size-1)||index<-1) {
			throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
		}
		int b = (size>>1);
		if(index<=b) {
			temp = first;
			for(int i=0;i<index;i++) {
				temp = temp.getNe();
			}
		}else {
			temp = last;
			for(int i=(size-1);i>index;i--) {
				temp = temp.getPr();
			}
		}
		return temp;
	}
	
	
	/***
	 * 直接删除指定位置的索引
	 * @param index
	 */
	public void remove(int index) {
		Node temp;
		Node Up;
		Node down;
		temp = getNode(index);
		if(index==0) {
			if(size==1) {
				first=null;
				last=null;
				size--;
			}else {
				first = temp.getNe();
				first.setPr(null);
				size--;
			}
			
		}else if(index==(size-1)){
			last = temp.getPr();
			last.setNe(null);
			size--;
		}else {
			Up = temp.getPr();
			down = temp.getNe();
			Up.setNe(temp.getPr());
			down.setPr(down.getPr());
			size--;
		}
		
		
	}

	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder("[");
//		sb.append();
		Node tmpe = first;
		while(tmpe!=null) {
			sb.append(tmpe.getElement()+",");
			tmpe =tmpe.getNe(); 	
		}
		if(size==0) {
			sb.append(']');
		}
		else {
			sb.setCharAt(sb.length()-1, ']');
		}
		return sb.toString();
		}
	}
	

4、添加泛型

import myConlection.Node;


/***
 * 添加remove的功能
 * @author starwang
 *
 */
public class myLinkList3 <E>{
	
	private Node first;
	private Node last;
	
	private int size;

	
	public void add(E obj) {
		Node node = new Node(obj);
		if(first==null) {
			node.setNe(null);
			node.setPr(null);
			first = node;
			last = node;		
		}else {
			//设置本节点往前一个节点进行跳转,设置下一个跳转的对象为null
			node.setPr(last);
			node.setNe(null);
			
			//设置上一个跳转的下一额对象为本对象
			last.setNe(node);
			last = node;			
		}
		size++;
	}
	
	
	public void add(int index,E obj) {
		if (index>(size-1)||index<-1) {
			throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
		}
		if(index==0) {
			Node node = new Node(obj);
			if(size==0) {
				node.setNe(null);
				node.setPr(null);
				first = node;
				last = node;
				size++;
			}else{
				first.setPr(node);
				node.setNe(first);
				first = node;
				size++;
			}
		}else if(index ==(size-1)) {
			add(obj);
		}else {
			Node node = new Node(obj);
			Node temp = getNode(index);
			Node temp1 = temp.getPr();
			temp.setPr(node);
			temp1.setNe(node);
			node.setPr(temp1.getNe());
			node.setNe(temp.getPr());
			size++;
			
		}
	}
	
	
	/***
	 * 获取这个元素
	 * @param index
	 * @return
	 */
	public E getElement(int index) {
		if (index>(size-1)||index<-1) {
			throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
		}

		/**
		 *未优化的代码 
		 */
//		Node tmpe = first;
//		for (int i = 0; i < index; i++) {
//			tmpe = tmpe.getNe();
//		}
		
		/**
		 * 优化的代码,选着在哪里进行开始查询
		 */
		Node tmpe;
		int b = (size>>1);
		if(index<=b) {
			tmpe = first;
			for(int i=0;i<index;i++) {
				tmpe = tmpe.getNe();
			}
		}else {
			tmpe = last;
			for(int i=(size-1);i>index;i--) {
				tmpe = tmpe.getPr();
			}
		}
		return (E) tmpe.getElement();
	}
		
	/***
	 * 获取指定位置的node
	 * @param index
	 * @return
	 */
	public Node getNode(int index ) {
		Node temp ;
		if (index>(size-1)||index<-1) {
			throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
		}
		int b = (size>>1);
		if(index<=b) {
			temp = first;
			for(int i=0;i<index;i++) {
				temp = temp.getNe();
			}
		}else {
			temp = last;
			for(int i=(size-1);i>index;i--) {
				temp = temp.getPr();
			}
		}
		return temp;
	}	
	/***
	 * 直接删除指定位置的索引
	 * @param index
	 */
	public void remove(int index) {
		Node temp;
		Node Up;
		Node down;
		temp = getNode(index);
		if(index==0) {
			if(size==1) {
				first=null;
				last=null;
				size--;
			}else {
				first = temp.getNe();
				first.setPr(null);
				size--;
			}		
		}else if(index==(size-1)){
			last = temp.getPr();
			last.setNe(null);
			size--;
		}else {
			Up = temp.getPr();
			down = temp.getNe();
			Up.setNe(temp.getPr());
			down.setPr(down.getPr());
			size--;
		}	
	}
	/***
	 * 替换指定位置的内容
	 * @param index
	 * @param obj
	 */
	public void replace(int index,Object obj) {
		Node element = getNode(index);
		element.setElement(obj);
	}
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder("[");
//		sb.append();
		Node tmpe = first;
		while(tmpe!=null) {
			sb.append(tmpe.getElement()+",");
			tmpe =tmpe.getNe(); 	
		}
		if(size==0) {
			sb.append(']');
		}
		else {
			sb.setCharAt(sb.length()-1, ']');
		}
		return sb.toString();
		}
	
	
	public static void main(String[] args) {
		myLinkList3<String> li = new myLinkList3<>();
		li.add("a");
		li.add("b");
		li.add("c");
		li.add("d");
		System.out.println(li);
		System.out.println(li.getElement(3));
		System.out.println(li.getNode(3));
		li.remove(3);
		li.remove(1);
		li.remove(0);
		li.remove(0);
		
		System.out.println(li);
	}
}

5、优化一下代码

import myConlection.Node;

/***
 * 添加remove的功能
 * @author starwang
 *
 */
public class myLinkList4 {
	
	private Node first;
	private Node last;
	
	private int size;

	
	public void add(Object obj) {
		Node node = new Node(obj);
		if(first==null) {
			node.setNe(null);
			node.setPr(null);
			first = node;
			last = node;		
		}else {
			//设置本节点往前一个节点进行跳转,设置下一个跳转的对象为null
			node.setPr(last);
			node.setNe(null);
			
			//设置上一个跳转的下一额对象为本对象
			last.setNe(node);
			last = node;			
		}
		size++;
	}
	
	
	public void add(int index,Object obj) {
		if (index>(size-1)||index<-1) {
			throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
		}
		if(index==0) {
			Node node = new Node(obj);
			if(size==0) {
				node.setNe(null);
				node.setPr(null);
				first = node;
				last = node;
				size++;
			}else{
				first.setPr(node);
				node.setNe(first);
				first = node;
				size++;
			}
		}else if(index ==(size-1)) {
			add(obj);
		}else {
			Node node = new Node(obj);
			Node temp = getNode(index);
			Node temp1 = temp.getPr();
			temp.setPr(node);
			temp1.setNe(node);
			node.setPr(temp1.getNe());
			node.setNe(temp.getPr());
			size++;
			
		}
	}
	
	
	/***
	 * 获取这个元素
	 * @param index
	 * @return
	 */
	public Object getElement(int index) {
		if (index>(size-1)||index<-1) {
			throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
		}

		/**
		 *未优化的代码 
		 */
//		Node tmpe = first;
//		for (int i = 0; i < index; i++) {
//			tmpe = tmpe.getNe();
//		}
		
		/**
		 * 优化的代码,选着在哪里进行开始查询
		 */
		Node tmpe;
		int b = (size>>1);
		if(index<=b) {
			tmpe = first;
			for(int i=0;i<index;i++) {
				tmpe = tmpe.getNe();
			}
		}else {
			tmpe = last;
			for(int i=(size-1);i>index;i--) {
				tmpe = tmpe.getPr();
			}
		}
		return tmpe.getElement();
	}
	
	
	/***
	 * 获取指定位置的node
	 * @param index
	 * @return
	 */
	public Node getNode(int index ) {
		Node temp ;
		if (index>(size-1)||index<-1) {
			throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
		}
		int b = (size>>1);
		if(index<=b) {
			temp = first;
			for(int i=0;i<index;i++) {
				temp = temp.getNe();
			}
		}else {
			temp = last;
			for(int i=(size-1);i>index;i--) {
				temp = temp.getPr();
			}
		}
		return temp;
	}
	
	
	/***
	 * 直接删除指定位置的索引
	 * @param index
	 */
	public void remove(int index) {
		Node temp;
		Node Up;
		Node down;
		temp = getNode(index);
		if(index==0) {
			if(size==1) {
				first=null;
				last=null;
				size--;
			}else {
				first = temp.getNe();
				first.setPr(null);
				size--;
			}
			
		}else if(index==(size-1)){
			last = temp.getPr();
			last.setNe(null);
			size--;
		}else {
			Up = temp.getPr();
			down = temp.getNe();
			Up.setNe(temp.getPr());
			down.setPr(down.getPr());
			size--;
		}
		
		
	}
	
	
	/***
	 * 替换指定位置的内容
	 * @param index
	 * @param obj
	 */
	public void replace(int index,Object obj) {
		Node element = getNode(index);
		element.setElement(obj);
	}
	
	
	
	
	
	
	

	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder("[");
//		sb.append();
		Node tmpe = first;
		while(tmpe!=null) {
			sb.append(tmpe.getElement()+",");
			tmpe =tmpe.getNe(); 	
		}
		if(size==0) {
			sb.append(']');
		}
		else {
			sb.setCharAt(sb.length()-1, ']');
		}
		return sb.toString();
		}
	
	
	public static void main(String[] args) {
		myLinkList4 li = new myLinkList4();
		li.add("a");
		li.add("b");
		li.add("c");
		li.add("d");
		System.out.println(li);
		System.out.println(li.getElement(3));
		System.out.println(li.getNode(3));
		li.remove(3);
		li.remove(1);
		li.remove(0);
		li.remove(0);
		
		System.out.println(li);
	}
}

6、Github连接

GitHub

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值