手工實現LinkedList

 集合LinkedList的底層是由鏈表來實現的,因此可以根據源碼仿寫個

package sxt.gaoqi.container;

public class JsLinkedList<E>
{
	private Node first;
	private Node last;
	
	private int size;
	
	public void add(E obj)
	{
		Node node = new Node(obj);
		
		if(first == null)
		{
			first = node;
			last = node;
		}
		else
		{
			node.previous = last;
			node.next = null;
			
			last.next = node;
			last = node;
		}
		
		size++;
	}
	
	
	public void add(int index, E obj)
	{
		Node newNode = new Node(obj);
		Node temp = getNode(index);
		
		if(temp != null)
		{
			Node up = temp.previous;
			
			up.next = newNode;
			newNode.previous = up;
			
			newNode.next = temp;
			temp.previous = newNode;
			
			size++;
		}
	}
	
	public E get(int index)
	{
		checkRange(index);
		
		Node temp = getNode(index);
		
		return temp != null ? (E)temp.element:null;
	}
	
	public Node getNode(int index)
	{
		checkRange(index);
		Node temp;
		
		if(index<=(size>>1))
		{
			temp = first;
			for(int i = 0; i < index; i++)
			{
				temp = temp.next;
			}
		}
		else
		{
			temp = last;
			for(int i = size - 1; i >index; i--)
			{
				temp = temp.previous;
			}
		}

		return temp;
	}
	
	public void remove(int index)
	{
		Node temp = getNode(index);
		if(temp != null)
		{
			if(temp.next != null)
			{
				temp.next.previous = temp.previous;
			}
			if(temp.previous != null)
			{
				temp.previous.next = temp.next;
			}
			if(index == 0)
			{
				first = temp.next;
			}
			if(index == size - 1)
			{
				last = temp.previous;
			}
			size--;
		}
	}
	
	private void checkRange(int index)
	{
		checkRange(index);
	}
	@Override
	public String toString()
	{
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		
		Node temp = first;
		while(temp != null)
		{
			sb.append(temp.element + ",");
			temp = temp.next;
		}
		sb.setCharAt(sb.length() - 1, ']');
		return sb.toString();
	}
	
	public static void main(String[] args)
	{
		JsLinkedList<String> list = new JsLinkedList<>();
		
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		list.add("e");

		list.add(4, "bb");
		System.out.println(list);

	}
}
package sxt.gaoqi.container;

public class Node
{
	Node previous;  //上一個節點
	Node next;  //下一個節點
	Object element;  //元素數據
	
	public Node(Node previous, Node next, Object element)
	{
		this.previous = previous;
		this.next = next;
		this.element = element;
	}
	
	public Node(Object element)
	{
		this.element = element;
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章