图灵架构师vip课程2345期-百度网盘下载-Java手写一个简单的链表

【微信642620018,获取全套课程】

package com.xintong.link;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

public class MyLinked<E> {
	
	private class Node<E>{
		private E e;
		private Node<E> next = null;
		Node(E e){
			this.e = e;
		}
	}

	private Node<E> first = null;
	
	/**
	 * 头部增加
	 * @param e
	 */
	public void insertFirst(E e){
		//new 一个节点对象  并存入数据 e
		Node<E> node = new Node<E>(e);
		//给这个节点添加下一个节点
		node.next = first;
		//把这个节点设置成第一个节点
		first = node;
	}
	
	/**
	 * 头部删除
	 * @return
	 */
	public E delFirst(){
		//判空
		isEmptyLinked();
		//拿出头部第一个元素  准备Return
		Node<E> node = first;
		//将下一个Node的数据 赋值给first
		first = first.next;
		//返回该数据
		return node.e;
	}
	/**
	 * 获取链表中储存的元素
	 * @param e
	 * @return
	 */
	public E getOne(E e){
		//判空
		isEmptyLinked();
		//获取头部元素
		Node<E> node = first;
		//循环判断node是否为空
		while(Objects.isNull(node)){
			//如果当前节点的数据 和 传入的数据相等
			if(node.e.equals(e)){
				//返回当前节点的数据
				return node.e;
			}
			//将node中下一个节点的数据复制给node进行下一轮循环判断直到node为空
			node = node.next;
		}
		return null;
	}
	
	/**
	 * 判断链表中是否包含某元素  实现思路参考 getOne
	 * @param e
	 * @return
	 */
	public boolean hasOne(E e){
		isEmptyLinked();
		Node<E> node = first;
		while(!Objects.isNull(node)){
			if(node.e.equals(e)){
				return true;
			}
			node = node.next;
		}
		return false;
	}
	
	/**
	 * 删除指定元素
	 * @param e
	 * @return
	 */
	public E removeOne(E e){
		isEmptyLinked();
		
		E result = null;
		//如果是第一个元素 
		if(first.e.equals(e)){
			result = first.e;
			//把第一个元素的 下一个元素赋值给第一个元素   删除了第一个元素
			first = first.next;
			return result;
		//如果不是第一个
		}else{
			
			Node<E> node = first;
			//判断是否含有下一个节点
			while(!Objects.isNull(node.next)){
				//如果下一个节点的数据和传入的数据相等
				if(node.next.e.equals(e)){
					result = node.next.e;
					//则让node越过下一个,指向下下一个,这样就删除的下一个。
					node.next = node.next.next;
					return result;
				}
				node = node.next;
			}
		}
		return null;
	}
	
	/**
	 * 列出链表所有元素
	 * @return
	 */
	public List<E> findAll(){
		isEmptyLinked();
		List<E> resultList = new ArrayList<>();
		Node<E> node = first;
		do{
			//将node数据添加到结果集中
			resultList.add(node.e);
			//将node的下一个节点赋值给node
			node = node.next;
			//当下一个节点为空时终止
		}while(!Objects.isNull(node));	
		Collections.reverse(resultList);
		return resultList;
	}
	
	
	private void isEmptyLinked(){
		if(Objects.isNull(first)) throw new RuntimeException("MyLinked is empty");
	}
	
	
	public static void main(String[] args) {
		MyLinked<String> myLink = new MyLinked<String>();
		myLink.insertFirst("a");
		myLink.insertFirst("b");
		myLink.insertFirst("c");
		myLink.insertFirst("d");
		myLink.insertFirst("e");
		System.out.println("---------------------------");
		System.out.println(myLink.findAll());
		System.out.println("-------删除头部e...----------");
		myLink.delFirst();
		System.out.println(myLink.findAll());
		String string = myLink.removeOne("c");
		System.out.println("-----删除指定的元素c--------"+"删除的元素是:"+string);
		System.out.println(myLink.findAll());
		System.out.println("-----是否包含a--"+myLink.hasOne("a"));
		System.out.println("-----是否包含b--"+myLink.hasOne("b"));
		System.out.println("-----是否包含c--"+myLink.hasOne("c"));
		System.out.println("-----是否包含d--"+myLink.hasOne("d"));
		System.out.println("-----是否包含e--"+myLink.hasOne("e"));
		System.out.println("-----是否包含f--"+myLink.hasOne("f"));
		
	}

}