/**
* @author: yekai <br/>
* Date: 2021/11/16:0:30 <br/>
* Description:单向链表的数据结构实现
*/
public class LinkList<T> {
//头结点
private Node head;
//记录链表的长度
private int N;
private class Node {
//元素
private T item;
//指向下一个节点
Node next;
public Node(T item, Node next) {
this.item = item;
this.next = next;
}
}
//初始化头结点,构造器
public LinkList(){
this.head = new Node(null,null);
this.N = 0;
}
//清空链表
public void clear(){
head.next = null;
this.N = 0;
}
//判断链表是否为空,空返回true,非空返回false
public boolean isEmpty(){
//直接返回长度是否等于0即可
return N==0;
}
//获取链表中元素的个数
public int length(){
return N ;
}
//读取并返回链表中第i个元素的值
public T get(int i){
Node n = head.next;
//通过循序从头结点依次往后找,依次找i次即可找对对应的元素
for (int index = 0; index < i; index++) {
//循环i次即可找到对应的结点
n = n.next;
}
return n.item;
}
//往链表中增加一个元素
public void insert(T t){
//找到当前最后一个结点
Node n = head;
while (n.next != null){
n = n.next;
}
//创建一个新的结点
Node now = new Node(t,null);
//最后一个结点指向now
n.next = now;
//链表节点数+1
N ++;
}
//在链表中第i个元素之前插入一个值为t的元素
public void insert(int i, T t){
//遍历到i之前的一个结点
Node n = head;
for (int index = 0; index < i-1; index++) {
n = n.next;
}
//遍历到i结点
Node iNode = n.next;
//新建一个结点t,他的next结点指向i结点
Node nowNode = new Node(t,iNode);
//修改i-1的结点的next指向t
n.next = nowNode;
//结点数加+1
N++;
}
//删除并返回链表中第i个数据元素
public T remove(int i){
//找到i-1个结点,修改他的结点指向i+1即可
Node n = head;
for (int index = 0; index < i-1; index++) {
n = n.next;
}
T removeNode = n.next.item;
n.next = n.next.next;
N--;
return removeNode;
}
//返回链表中首次出现的指定数据元素的序号,若不存在,返回-1
public int indexOf(T t){
Node n = head;
if(n.item!=t){
for (int index = 0; n.next!=null; index++) {
n = n.next;
if(n.item.equals(t)){
return index;
}
}
return -1;
}return 1;
}
}