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. Javascript 封装问题

    Javascript 封装问题 为什么会用这样一个题目呢,这是要说封装的什么问题,本文并不讲高深的封装理论,只是解决一个小问题. 问题来源 今天在百度知道上闲逛,遇到一个网友的问题,问题如下,问题的地 ...

  2. 7z文件格式及其源码的分析

    7z文件格式及其源码的分析 本文是一个系列. 主要是分享我最近一年做7z文件开发的经验. 主要包括7z官方源码的结构分析, 以及7z文件格式的分析. 其中涉及到7z源码结构的各个细节, 以及7z文件格 ...

  3. vs2008 试用版评估到期 vs2008试用版 升级正式版

    心得: 解决Vs2008 试用版升级正式版 1.在控制面板里面找到vs2008的程序. 2.点击 更改删除按钮, 3.出现Vs2008的维护模式. 4.在此维护模式下,如果没有出现填写正版密匙的地方, ...

  4. WCF小实例以及三种宿主

    WCF小实例以及三种宿主 最近一直在学习WCF相关知识,下面将通过一个小实例对所学的知识进行简单的回顾:本实例是一个简单三层操作数据库,并且也简单实现的三种宿主(控制台宿主,IIS宿主以及Window ...

  5. ASP.NET MVC:利用ASP.NET MVC4的IBundleTransform集成LESS

    ASP.NET MVC:利用ASP.NET MVC4的IBundleTransform集成LESS 背景 LESS确实不错,只是每次写完LESS都要手工编译一下有点麻烦(VS插件一直没有安装好),昨天 ...

  6. Javascript内存泄漏

    Javascript内存泄漏 原文:http://point.davidglasser.net/2013/06/27/surprising-javascript-memory-leak.html 本周 ...

  7. cocos2d-x场景切换与过渡效果

    场景切换 void  MyScene::daySceneCallback(CCObject *pSender) {     CCScene *scene =  new  MyScene();      ...

  8. [置顶] Oracle学习经验谈

    经常遇到朋友问oracle学习难不难,怎么才能成为高手等等,我想结合我的个人经验简单说几点: 1.打好基础,由浅入深 学习Oracle不能急于求成,寄希望于一天成为一个大侠.学习有个过程,应该由浅入深 ...

  9. 通过Shell脚本读取properties文件中的参数时遇到\r换行符的问题

    今天在编写微服务程序启动脚本的时候,遇到一个比较奇葩的问题,下面给出具体描述: 目标:通过读取maven插件打包时生成的pom.properties文件,获取里面的应用名称和应用版本号,然后拼接得到s ...

  10. html5新标签布局应用指南

    html5中为了便于设计者的网站布局新添加了一些标签,本文主要讲解这些标签的实际应用方法. 大多数前端的朋友在设计网站时主要应用<div>标签构造盒子进行布局,这是种非常高效的方法,可以将 ...