手工实现LinkedList

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40301026/article/details/86510295

https://mp.csdn.net/postedit/86773133

参照其底层代码,按照自己的理解实现了LinkedList的一些基本功能。

如果对c和c++指针了解一下,理解起来非常快。

package cn.liu.MyLinkedList;

//结点
public class Node {
	Node prevoius;//上一个节点
	Node next;//下一个节点
	Object element;//数据
	
	//一个全参构造器
	public Node(Node prevoius, Node next, Object element) {
		super();
		this.prevoius = prevoius;
		this.next = next;
		this.element = element;
	}
	
	//构造器,来传数据
	public Node(Object element) {
		super();
		this.element = element;
	}
	
	
}
package cn.liu.MyLinkedList;

/**
 * 自定义一个链表
 * @author Dick
 *
 */

public class MyLinkedList<E> {
	//链表的头和尾,没有实例化
	private Node first;
	private Node last;
	private int size;//链表的长度
	
	//add函数,每一个加在链表尾
	public void add(E obj) {
		Node node  = new Node(obj);//把数据已经装到此结点里
		
		if(first==null)
		{
			//链表为空的话,它的前面和后面指向都为空
			node.prevoius = null;
			node.next = null;
			
			//它是链表的第一个也是最后一个元素
			first = node;
			last = node;
		}
		else
		{
			//本结点的前驱和后驱处理
			node.prevoius = last;
			node.next = null;
			
			//上一个结点指向本结点, 然后设置node为链表最后一个结点
			last.next = node;
			last = node;
		}
		size++;
	}

	//add函数,在指定位置插入一个结点
	//先通过index找到位置,再插入
	public void add(E obj,int index) {
		Node newnode = new Node(obj);//新建一个结点
		Node temp = getnode(index);//找到指定结点
		
		if(index == 0)//第一个结点
		{
			first.prevoius = newnode;
			newnode.next = first;
			newnode.prevoius = null;
			first = newnode;
		}
		else //其他结点
		{
			//newnode前面结点的操作
			temp.prevoius.next = newnode;
			newnode.prevoius = temp.prevoius;
			
			//newnode后面结点的操作
			temp.prevoius = newnode;
			newnode.next = temp;
		}
		size--;
	}
	
	//判断索引是不是合法
	public void judge(int index) {
		if(index < 0 ||index>size-1)
		{
			throw new RuntimeException("索引数字不合法:"+index);
		}
	}
	
	//找到某个节点
	public Node getnode(int index) {
		judge(index);
		Node temp = null;
		
		if(index<=(size>>1))//从前面查找
		{
			temp = first;
			for(int i=0;i<index;i++)
			{
				temp = temp.next;
			}
		}
		else//从后面查找
		{
			temp = last;
			for(int j = size-1 ;j>index;j--) {
				temp = temp.prevoius;
			}
		}
		return temp;
	}
	
	//get函数
	public Object get(int index) {
		judge(index);
		return getnode(index).element;
	}
	
	//toString函数重写
	@Override
	public String toString() {
		StringBuilder   sb = new StringBuilder("[");
		Node  temp = first;
		while(temp!=null){
			sb.append(temp.element+",");
			temp = temp.next;
		}
		sb.setCharAt(sb.length()-1, ']'); 
		
		return sb.toString();
	}
	
	//remove函数 移除指定结点
	public void remove(int index) {
		judge(index);
		Node temp = getnode(index);
		
		if(temp!=null)
		{
			Node one = temp.prevoius;//temp前一个节点
			Node two = temp.next;//temp后一个结点
			
			//被删除结点为首结点
			if(index==0)
			{
				two.prevoius = null;
				first = two;
			}
			//被删除结点为尾结点
			if(index == size-1)
			{
				one.next = null;
				last = one ;
			}
			//被删除结点为中间的结点
			if(one!=null)
			{
				one.next = two;
			}
			if(two!=null)
			{
				two.prevoius = one;
			}
			
			size--;
		}
	} 
	
		
}

猜你喜欢

转载自blog.csdn.net/qq_40301026/article/details/86510295