图灵架构师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"));
}
}