Java模拟单向链表


阳光少年     2020-08-25     1271

Java模拟单向链表

目录

节点(Node)

package Demo;

public class Node {

	private Node next;
	
	private Object value;

	public Node() {
		
	}
	
	public Node(Object value,Node next) {
		this.value = value;
		this.next = next;
	}
	
	public Node getNext() {
		return next;
	}

	public void setNext(Node next) {
		this.next = next;
	}

	public Object getValue() {
		return value;
	}

	public void setValue(Object data) {
		this.value = data;
	}
	
	
	
}

package Demo;

public class Mylink<T> {

	private Node head;

	private int size = 0;
	
	public int getSize() {
		return size;
	}
	
	public void add(T value) {
		
		//如果头节点为null,直接添加到头节点中
		if (head == null) {
			head = new Node(value,null);
		}else {
			//当头节点不为null,通过头节点找到末尾节点
			Node currentNode = findLastNode(head);
			//将要添加的元素加入末尾节点
			currentNode.setNext(new Node(value,null));
		}
		//更新size
		size ++;
	}


	//	123 321 369
	
	//找尾节点
	private Node findLastNode(Node head) {
		
		//如果头节点的下一个节点是null,那麽表示头节点就是末尾节点
		//判断一个节点是否为末尾节点,就是看他的next是否为null,如果为null即为末尾节点
		if(head.getNext() == null) {
			return head;
		}

		//如果不是末尾节点,递归
		return findLastNode(head.getNext());
	}
	
	//删除元素
	public void remove(int index) {
		
		//默认指向头节点
		Node pointer = this.head;
		
		//如果指定下标不小于size,或小于0,直接返回
		if (judge(index)) {
			return;
		}
		
		//删除第一个元素
		if (index == 0) {
			head = pointer.getNext();
			return;
		}
		
		//在此循环中,需要将指针指向需要删除的元素的上一个元素
		for (int i = 0; i < index-1; i++) {
			pointer = pointer.getNext();
		}
		
		/*
		 * 将需要删除的元素的上一个元素的next指向下一个的下一个即可
		 */
		pointer.setNext(pointer.getNext().getNext());
		//更新size
		size --;
	}
	
	//获取元素
	public Object get(int index) {
		
		//如果指定下标不小于size,或小于0,直接返回
		if(judge(index)) {
			return null;
		}
		
		//默认指向头节点
		Node pointer = this.head;
		
		//如果index = 0 直接返回头节点的value值
		if (index == 0) {
			return pointer.getValue();
		}
		
		/*
		 * 此处进入这个循环后pointer指向的是第二个节点,因为默认指向头节点
		 * 在判断时,需要index - 1
		 */
		for (int i = 0; i < index; i++) {
			pointer = pointer.getNext();
			if (i == index-1) {
				return pointer.getValue();
			}
		}
		return null;
	}
	
	
	//修改元素
	public void update(Object value,int index) {
		//判断
		if (judge(index)) {
			return;
		}
		//默认指向头节点
		Node headNode = this.head;
		
		//如果index为0,直接修改头节点
		if (index == 0) {
			headNode.setValue(value);
		}
		
		/*
		 * 此处与获取元素相同,进入循环已经指向第二个节点所以index -1
		 */
		for (int i = 0; i < index; i++) {
			headNode = headNode.getNext();
			if (i == index -1) {
				headNode.setValue(value);
			}
		}
	}
	
	
	//print
	public void print() {
		//头节点
		Node head = this.head;
		
		/*
		 * 如果当前节点不为null,打印value值,如果下一个节点不为null那麽指向下一个节点,否则退出循环
		 */
		while(head != null) {
			System.out.println(head.getValue());
			if (head.getNext() != null) {
				head = head.getNext();
			}else 
				break;
		}
	}
	
	//判断下标是否在区间[0,size)中
	private boolean judge(int index) {
		
		return !(index < size) || index < 0 ;
	}
	
}

测试


package Demo;

public class Test {

	public static void main(String[] args) {
		
		//创建链表
		Mylink link = new Mylink();
		
		link.add("123");
		link.add("321");
		link.add("369");
		
		link.print();
		
		System.out.println(link.getSize());
		
		link.update("999", 0);
		
		link.remove(-1);
		
		link.print();

		System.out.println(link.get(0));
		
	}
	
}