Java实现链式存储的线性表

package com.test.mylinkedlist;


import javax.swing.border.EmptyBorder;


import com.test.myarraylist.MyArrayList;


/**
 * 链式结构的线性表的实现
 * @author Wangjie
 * @version 1.0
 * 
 */
public class MyLinkedList <T>{
/**
* 节点抽象类
* @author Administrator
*
*/
private class Node{
//存放节点数据
private T data;
//存放下一个节点的引用
private Node next;
/**
* 无参构造器
*/
public Node(){
}
/**
* 通过数据,下一个节点的引用来的构造器
* @param data 数据
* @param next 下一个节点的引用
*/
public Node(T data,Node next){
this.data = data ;
this.next = next ;
}
}
private final String INDEX_OUT_OF_BOUNDS_WARN = "线性表索引越界";
//记录链表的头节点
private Node header;
//记录链表的尾节点
private Node tail;
//记录链表的大小,即包含的节点数
private int size;
/**
*创建空链表 
*/
public MyLinkedList(){
header = null ;
tail = null ;
}
/**
* 以一个元素创建链表
* @param element 传入的元素
*/
public MyLinkedList(T element){
header = new Node (element , null) ;
tail = header;
size++;
}
/**
* 返回链表的长度
* @return 链表的长度
*/
public int length(){
return size;
}
/**
* 返回索引处的元素
* @param index 索引
* @return 元素
*/
public T get(int index){
return getNodeByIndex(index).data;
}
/**
* 返回索引处的节点
* @param index
* @return
*/
private Node getNodeByIndex(int index){
if(index<0 || index>size-1){
throw new IndexOutOfBoundsException(INDEX_OUT_OF_BOUNDS_WARN);
}
Node _current = header;
for(int i = 0; i < size && _current != null; i++ ,_current = _current.next ){

if(i == index){
return _current;
}
}
return null;
}
/**
* 查找元素的索引,找不到返回-1
* @param element 元素
* @return 索引
*/
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(T element , int index){
if(index<0 || index>size-1){
throw new IndexOutOfBoundsException(INDEX_OUT_OF_BOUNDS_WARN);
}
if(header == null){
add(element);
}
else{
if(index == 0){
addAtHeader(element);
}
else{
Node _prvNode = getNodeByIndex(index);
_prvNode.next = new Node(element , _prvNode.next);
size++;
}
}
}
/**
* 用尾插法为链表添加新的节点
* @param element 元素
*/
public void add(T element){
if(header == null){
header = new Node(element , null);
}
else{
Node _newNode = new Node(element , null);
tail.next = _newNode;
tail = _newNode;
}
size++;
}
/**
* 用头插法为链表添加新的节点
* @param element 节点数据
*/
public void addAtHeader(T element){
header = new Node(element , header);
//如果插入之前是空链表,则更新tail节点
if(tail == null ){
tail = header;
}
size++;
}
/**
* 删除指定索引处的节点
* @param index 索引
* @return 返回被删除的节点
*/
public T delete(int index){
if(index < 0 || index > size-1){
throw new IndexOutOfBoundsException(INDEX_OUT_OF_BOUNDS_WARN);
}
Node _oldNode = null;
if(index == 0){
_oldNode = header;
header = header.next;
}
else if(index == size - 1){
_oldNode = tail ;
tail=getNodeByIndex(size-1);
tail.next = null;
}else{
_oldNode = getNodeByIndex(index);
Node prvNode = getNodeByIndex(index-1);
prvNode.next = getNodeByIndex(index+1);
}
size--;
return (T) _oldNode;
}
/**
* 从尾部删除节点
* @return 返回被删除的节点
*/
public T remove(){
return (T)delete(size-1);
}
/**
* 判断链表是否为空
* @return 返回是否为空
*/
public boolean empty(){
return size==0;
}
/**
*清空链表 
*/
public void clear(){
header = null;
tail = null;
size = 0;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值