package ch9;

public class LinkList <T>{

private class Node
{
//保存节点的数据
private T data;
//指向下一个节点的引用
private Node next;
public Node(T data,Node next)
{
this.data = data;
this.next = next;
}
}
//保存该链表的头节点
private Node header;
//保存该链表的尾节点
private Node tail;
//保存该链表已有的节点数
private int size;
//创建空链表
public LinkList()
{
header =null;
tail = null;
}
//以指定元素来创建链表,该链表只有一个元素
public LinkList(T element)
{
header = new Node(element, null);
tail =header;
size++;
}
//返回链表的长度
public int length()
{
return size;
}
//获取链表索引为index处的元素
public T get(int index)
{
return getNodeByIndex(index).data;
}

private Node getNodeByIndex(int index)
{
if(index<0 || index>size-1)
throw new IndexOutOfBoundsException("线性表索引越界");
Node current = header;
for(int i=0;i<size &&current!=null;i++,current=current.next)
{
if(i==index)
return current;
}
return null;
}

// 查找执行元素的位置
public int locate(T element){
Node current = header;
for(int i=0;i<size && current!=null;i++,current=current.next)
{
if(current.data.equals(element))
return i;
}
return -1;
}
//向指定位置插入一个元素
public void insert(int index,T element)
{
if(index<0 || index>size)
throw new IndexOutOfBoundsException("索引越界");
//如果是空链表
if(header == null)
{
add(element);
}
else{
if(index ==0)
{
addAtHeader(element);
}
else{
Node prev = getNodeByIndex(index-1);

prev.next =new Node(element,prev.next);
// prev.next =prev.next.next;
//prev.next.data =element;

}
}
}
//头部插入节点
private void addAtHeader(T element) {
// TODO Auto-generated method stub
header = new Node(element,header);
if(tail ==null){
tail =header;
}
size ++;
}
//尾部插入
public void add(T element) {
// TODO Auto-generated method stub
if(header ==null)
{
header = new Node(element,null);
tail =header;
}
else{
Node newNode = new Node(element,null);
tail.next =newNode;
}
size++;
}
}

最新文章

  1. RoboGuice 3.0 (一)入坑篇
  2. C#测试运行时间
  3. 接触Matlab5年一个总结(Matlab要掌握的一些要点 )
  4. 关于vs调试中kaze时出现的问题
  5. iNeedle产品介绍
  6. 深入理解gradle编译-Android基础篇
  7. 一起刷LeetCode5-Longest Palindromic Substring
  8. 【MongoDB】 安装为windows services
  9. MyEclipse 设置字体
  10. Git客户端(Windows系统)的使用
  11. java设计模式之 装饰器模式
  12. Android BLE与终端通信(一)——Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址
  13. C++ 黑白棋AI minimax+alphabeta剪枝
  14. Spring MVC 集成Disconf
  15. [学习笔记]插头dp
  16. python中 cmp
  17. Spark源码分析
  18. Java实现ping功能的三种方法及Linux的区分
  19. 第六章 consul UI
  20. sqlalchemy 判断字段是否存在

热门文章

  1. .NET 开源工作流: Slickflow流程引擎高级开发(九) -- 条件事件模式解释及应用
  2. 【java+selenium3】Actions模拟鼠标 (十一)
  3. LeetCode 78. 子集 C++(位运算和回溯法)
  4. LeetCode 114. 二叉树展开为链表 C++
  5. GO的安装以及GoLand破解
  6. Spark 安装部署与快速上手
  7. react之路由
  8. [Aizu2993]Invariant Tree
  9. vue 3 学习笔记 (七)——vue3 中 computed 新用法
  10. Atcoder Grand Contest 022 E - Median Replace(dp)