[Java]-手工实现LinkedList链表

  • 链表是一种物理存储结构上非连续、非顺序的存储结构
  • 数据元素的逻辑顺序是通过链表中的指针链接次序实现的
  • 链表中每个节点的 next 引用都相当于一个指针,指向另一个节点

Node.java:(元素类)

package cn.zhazong710.test;

public class Node {
	
	Node previous;  //上一个节点
	Node next;      //下一个节点
	Object element; //元素数据
	
	public Node(Node previous,Node next,Object element) {
		super();
		this.previous = previous;
		this.next = next;
		this.element = element;
	}

	public Node(Object element) {
		super();
		this.element = element;
	}
}

ZZLinkedList.java:(链表)

package cn.zhazong710.test;

public class ZZLinkedList<E> {
	
	private Node first;
	private Node last;
	
	private int size;
	
	public void add(int index,E element) {  //指定位置增加元素
		
		checkRange(index);
		
		Node newNode = new Node(element);
		Node temp = getNode(index);
		
		if(temp!=null) {
			
			Node up = temp.previous;
			
			up.next = newNode;
			newNode.previous = up;
			
			newNode.next = temp;
			temp.previous = newNode;
			
		}
		
	}
	
	public void remove(int index) {  //删除指定元素
		
		checkRange(index);
		
		Node temp = getNode(index);
		
		if(temp!=null) {
			
			Node up = temp.previous;
			Node down = temp.next;
			
			if(up!=null) {
				up.next = down;
			}
			
			if(down!=null) {
				down.previous = up;
			}
			//第一个元素被删除
			if(index==0) {
				first = down;
			}
			//第二个元素被删除
			if(index==size-1) {
				last = up;
			}
			
			size--;
		}
		
	}
	
	public E get(int index) {  //索引查找
		
		checkRange(index);
		
		Node temp = getNode(index);
		
		return temp!=null?(E)temp.element:null;
	}
	
	private void checkRange(int index) {  //检查长度合法性
		if(index<0||index>size-1) {
			throw new RuntimeException("索引数字不合法"+index);
		}
	}
	
	private Node getNode(int index) {  //折半查找
		
		checkRange(index);
		
		Node temp = null;
		
		if(index<=(size>>1)) {  //size>>1相当于除以2
			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 add(E element) {  //最后增加一个元素
		
		Node node = new Node(element);
		
		if(first==null) {
			
			first = node;
			last = node;
			
		}else {
			
			node.previous = last;
			node.next = null;
			
			last.next = node;
			last = node;
			
		}	
		size++;
	}
	
	@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();
	}
	
	public static void main(String[] args) {
		
		ZZLinkedList<String> list = new ZZLinkedList<>();
		
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		list.add("e");
		list.add("f");
		list.add("g");
		
		System.out.println(list);
		
	}
	
}

闸总710

感谢观看闸总博客,本博客为个人学习交流使用
订阅
提醒
guest

0 评论
内联反馈
查看所有评论