public class ChainTable {

private Node firstNode;//第一个节点

private Node lastNode;//最后一个节点

private int size;//链表中含有的元素个数

public int size(){//返回链表中含有的元素个数

return size;

}

//添加一个节点

public void add(Object obj){

if(size == 0){//当添加的节点为第一个节点的时候

Node node = new Node();

node.setObj(obj);

lastNode = node;

firstNode = node;

firstNode.setNextNode(lastNode);

lastNode.setNextNode(null);

size++;

}else{

Node node = new Node();

node.setObj(obj);

lastNode.setNextNode(node);

lastNode = node;

size++;

}

}

//添加一个链表

public void add(ChainTable table) throws Exception{

if(table != null){

for(int i=0;i<table.size();i++){

this.add(table.get(i));

}

}

}

//获取所在索引的节点中的值

public Object get(int index) throws Exception{

return getNode(index).getObj();

}

//获得对应索引的节点

private Node getNode(int index) throws Exception{

//让node 指向第一个节点

Node node = firstNode;

//保证index在正常区间内

if(index < 0 || index >= size){

throw new Exception();

}else{

for(int i=0;i<index;i++){

node = node.getNextNode();

}

}

return node;

}

//删除所在索引的值

public void remove(int index) throws Exception {

if(index < 0 | index >=size){

throw new Exception();

}

if(index == 0){

firstNode = firstNode.getNextNode();

}else if (index == (size -1)){

Node upNode = getNode(size -2);

lastNode = upNode;

}else{

Node upNode = getNode(index - 1);

Node node = upNode.getNextNode();

Node nextNode = node.getNextNode();

upNode.setNextNode(nextNode);

node = null;

}

size--;

}

//判断是否包含某个元素

public boolean contain(Object obj) throws Exception{

return indexOf(obj) >= 0;

}

//返回obj的索引  若没有此元素 则返回-1

public int indexOf(Object obj) throws Exception{

int index = -1;

if(obj == null){

for(int i=0;i<size - 1;i++){

if(get(i) == null){

index = i;

break;

}

}

}else{

for(int i=0;i<size -1;i++){

if(get(i).equals(obj)){

index = i;

break;

}

}

}

return index;

}

//内部类Node

public class Node{

private Object obj;//数据域

private Node nextNode;//指针域  指向下一个节点

public Node(){//构造方法

}

public Node(Object obj,Node nextNode){//构造方法

this.obj = obj;

this.nextNode = nextNode;

}

public Object getObj() {//获取数据

return obj;

}

public void setObj(Object obj) {//设置数据

this.obj = obj;

}

public Node getNextNode() {//获得下一个节点

return nextNode;

}

public void setNextNode(Node nextNode) {//设置下一个节点

this.nextNode = nextNode;

}

}

}

单向链表仿LinkedList的更多相关文章

  1. JS数据结构与算法--单向链表

    链表结构:链表中每个元素由一个存储元素本身的节点和一个指向下一元素的引用组成.如下所示(手画的,比较丑,懒得用工具画了,嘻嘻) 1.append方法,向链表末尾插入一个节点 2.insert(posi ...

  2. 数据结构(1) 第一天 算法时间复杂度、线性表介绍、动态数组搭建(仿Vector)、单向链表搭建、企业链表思路

    01 数据结构基本概念_大O表示法 无论n是多少都执行三个具体步骤 执行了12步 O(12)=>O(1) O(n) log 2 N = log c N / log c N (相当于两个对数进行了 ...

  3. Python 单向链表、双向链表

    用面向对象实现Linkedlist链表 单向链表实现append.iternodes 双向链表实现append.pop.insert.remove.iternodes 单向链表与双向链表 单向链表: ...

  4. [Java算法分析与设计]--单向链表(List)的实现和应用

    单向链表与顺序表的区别在于单向链表的底层数据结构是节点块,而顺序表的底层数据结构是数组.节点块中除了保存该节点对应的数据之外,还保存这下一个节点的对象地址.这样整个结构就像一条链子,称之为" ...

  5. 玩转C线性表和单向链表之Linux双向链表优化

    前言: 这次介绍基本数据结构的线性表和链表,并用C语言进行编写:建议最开始学数据结构时,用C语言:像栈和队列都可以用这两种数据结构来实现. 一.线性表基本介绍 1 概念: 线性表也就是关系户中最简单的 ...

  6. 数据结构与算法之链表(LinkedList)——简单实现

    这一定要mark一下.虽然链表的实现很简单,且本次只实现了一个方法.但关键的是例子:单向链表的反转.这是当年我去H公司面试时,面试官出的的题目,而当时竟然卡壳了.现在回想起来,还是自己的基本功不扎实, ...

  7. JAVA 单向链表

    package com.session.link; /** * 单向链表 */public class LinkedList<T> { private Node head;//指向链表头节 ...

  8. C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码

    实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1-> ...

  9. JS实现单向链表、双向链表、循环链表

    https://cloud.tencent.com/developer/article/1114246 链表存储有序的元素的集合,但是和数组不同的是,链表中的元素在内存中的存储并不是连续的.每一个链表 ...

随机推荐

  1. mac 下nginx加入开机启动

    通过brew install nginx后设置开机启动项 sudo cp /usr/local/opt/nginx/*.plist /Library/LaunchDaemonssudo launchc ...

  2. 强制卸载VS2013

    最近因为VS2013闹许可证过期问题,加之又发现新版本update5,所以就想卸掉重装,但是按照正常的卸载,发现卸载不了,再后来force强制卸载,OK了. force强制卸载: 首先如果安装了中文包 ...

  3. SQLite数据库操作 (原始操作)

    android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API, 使用该类可以完成对数据进行添加(Create).查询(Retrieve).更新(Update)和删除( ...

  4. asp.net内部原理3

    asp.net内部原理(三) 第三个版本 (最详细的版本) 前言: 今天继续吧这个系列补齐,这几天公司的项目比较忙,回到家已经非常的累了,所以也没顾得上天天来这里分享一些东西和大家一起探讨,但是今天晚 ...

  5. js正则验证邮箱格式

    首先总结一下邮箱的格式,邮箱由@分隔,左侧为用户名,右侧为邮箱域名,用户名可以由字母.数字._.-以及.组成,但是必须是以字母或数字开头,邮箱的域名是由字母.数字.-和.组成的,但是必须以.加上字母的 ...

  6. slxna,游戏页面切到后台回来后返回sl页面导致sl页面无响应,解决方法。

    slxna在wp7上表现很好,因为那会xna还是微软的亲儿子.但是到wp8时代,微软丢弃xna,不管不问了.但是丢之前没有把兼容搞的完美,以致有很多隐秘的坑,说不定就踩到了. 我这个游戏的sl页面用了 ...

  7. ISupportInitialize的用处

      [译]ISupportInitialize的用处   [译]ISupportInitialize的用处 注:本文是对How ISupportInitialize Can Help的翻译.原文作者编 ...

  8. sql server数据库中删除的过程

    这是在vb中的一个对数据库中数据的删除过程,点击按钮后程序第一句则是将你要删除的那条记录的位置作为书签保存到myBookmark这个变量里面,然后选择确定删除的话,首先执行if语句下的第一句 mrc. ...

  9. Oracle体系结构及备份(十七)——bg-others

    一 其他进程 Archiver (ARCn) Oneor more archiver processes copy the redo log files to archival storage whe ...

  10. 2013 Esri全球用户大会之元数据支持

    1.1 是否支持FGDC CSDGMArcGIS是否支持FGDC CSDGM和North American Profile (NAP)元数据标准?如何支持? 支持,从ArcGIS forDesktop ...