package com.hephec.ds;





public class LinkedList<T> {

//定义一个内部类节点Node Node实例代表链表的节点

class Node{

//保存节点的数据

private T data;

//保存下一个节点的引用

private Node next;

//无參的构造方法

public Node(){

}

//有參的构造方法

public Node(T data,Node next){

this.data=data;

this.next=next;

}

}

//保存该链表的头节点

private Node header;

//保存该链表的尾节点

private Node tail;

//保存该链表中以及包括的节点数

private int size;

//创建空链表

public LinkedList(){

//空链表,header,tail都为null

header=null;

tail=null;

}

//以指定数据元素来创建链表。该链表仅仅有一个元素

public LinkedList(T element){

header=new Node(element,null);

//仅仅有一个节点。header和tail都指向该节点

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("线性表索引越界");

}

//从header节点開始

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-1&&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){

throw new IndexOutOfBoundsException("线性表索引越界");

}

//假设还是空链表

if(header==null){

add(element);

}

else{

//当index=0时,也就是在链表头插入

if(index==0){

addAtHeader(element);

}

else{

//获取插入点的前一个节点

Node prev=(Node) getNodeByIndex(index-1);

//让prev的next指向新节点

//让新节点的next引用指向原来prev的下一个节点

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

size++;

}

}

}

//採用头插法为链表加入新节点


private void addAtHeader(T element) {

//创建新节点。让新节点的next指向原来的header

//并以新节点作为新的header

header=new Node(element,null);

//假设插入之前是空链表

if(tail==null){

tail=header;

}

size++;

}

//採用尾插法为链表加入新节点

private void add(T element) {

//假设该链表还是空链表

if(header==null){

header=new Node(element,null);

//仅仅有一个节点,让header和tail都指向该节点

tail=header;

}

else{

//创建新节点

Node newNode=new Node(element,null);

//让尾节点的next指向新增的节点

tail.next=newNode;

//以新节点作为新的尾节点

tail=newNode;

}

size++;

}

//删除链式线性表指定索引处的元素

public T delete(int index){

if(index<0||index>size-1){

throw new IndexOutOfBoundsException("数组索引越界");

}

Node del=null;

//假设被删除的是header

if(index==0){

del=header;

header=header.next;

}

else{

//获取删除点的前一个节点

Node prev=getNodeByIndex(index-1);

//获取将要被删除的节点

del=prev.next;

//让删除节点的next指向被删除节点的下一个节点

prev.next=del.next;

del.next=null;



}

size--;

return del.data;

}

//刪除鏈式線性表中最後一個元素

public T remove(){

return delete(size-1);

}

//推断线性表是否为空表

public boolean isEmpty(){

return size==0;

}

//清空线性表

public void clear(){

//header,tail赋值为null

header=null;

tail=null;

size=0;

}

public String toString(){

//推断线性表是否为空

if(isEmpty()){

return "[]";

}

else{

StringBuilder sb=new StringBuilder("[");

for(Node current=header;current!=null;current=current.next){

sb.append(current.data.toString()+", ");

}

int len=sb.length();

return sb.delete(len-2,len).append("]").toString();



}



}



}

版权声明:本文博主原创文章。博客,未经同意不得转载。

java实现线性链表结构的更多相关文章

  1. 【二叉树->链表】二叉树结构转双向线性链表结构(先序遍历)

    二叉树存储结构属于非线性链表结构,转化成线性链表结构,能简化操作和理解.然而由非线性转线性需要对整个树遍历一次,不同的遍历方式转化结果页不一样.下面以先序为例. 方法一: 递归法.递归遍历二叉树,因为 ...

  2. 《Java数据结构》链表结构(单向链表,双向链表)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...

  3. Java程序设计之链表结构

    唉,说点废话,昨天偶尔看到一年前自己用C解约瑟夫环问题的循环链表,唏嘘不已,想想自己一年前嵌入式的梦呢,这两天发生了许多,而有些人不在了就真的不在了,心情不好,不多说了,直接上代码,只是些链表的基本操 ...

  4. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

  5. java数据结构--线性结构

    一.数据结构 数据结构由数据和结构两部分组成,就是将数据按照一定的结构组合起来,这样不同的组合方式有不同的效率,可根据需求选择不同的结构应用在相应在场景.数据结构大致 分为两类:线性结构(如数组,链表 ...

  6. 线性链表的双向链表——java实现

    .线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为 ...

  7. (原创)用Java实现链表结构对象:单向无环链表

    转载请注明本文出处:http://www.cnblogs.com/Starshot/p/6918569.html 链表的结构是由一个一个节点组成的,所谓链,就是每个节点的头尾连在一起.而单向链表就是: ...

  8. java实现链表结构详细代码

    一.数据准备 1. 定义节点 2.   定义链表 1.数据部分 2.节点部分 class DATA //数据节点类型 { String key; String name; int age; } cla ...

  9. Java实现链表结构的具体代码

    一.数据准备 1. 定义节点 2.   定义链表 1.数据部分 2.节点部分 class DATA //数据节点类型 { String key; String name; int age; } cla ...

随机推荐

  1. hdu1151 Air Raid,DAG图的最小路径覆盖

    点击打开链接 有向无环图的最小路径覆盖 = 顶点数- 最大匹配 #include <queue> #include <cstdio> #include <cstring& ...

  2. 2-13. 平均两个有序序列(25)(ZJU_PAT 名单 | 排列 )

    主题链接:http://pat.zju.edu.cn/contests/ds/2-13 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A0, A1-AN-1的中位 ...

  3. 获取Enum枚举值描述的几法方法

    原文:获取Enum枚举值描述的几法方法 1.定义枚举时直接用中文 由于VS对中文支持的很不错,所以很多程序员都采用了此方案. 缺点:1.不适合多语言 2.感觉不太完美,毕竟大部分程序员大部分代码都使用 ...

  4. hdu2412(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2412 题意:给定一棵关系树 , 从中选择一些点 , 使这些点均不存在亲子关系 , 最多能取多少个点 , ...

  5. win7系统u盘安装过程

    1.准备好带有启动项的U盘,并把镜像解压到里面去 2.插上u盘,开机长按del键进入bois设置界面 在boot页面 1.boot device priority->1st boot devic ...

  6. Xcode6在10.9.4上面crash解决

    具体请看我的evernote 这里: 在10.9.4系统上面直接安装xcode6的beta3.和平时一样, 1.将beta3拖拽到application文件夹中. 2.等待copy完毕,执行xcode ...

  7. app服务器

    http://heipark.iteye.com/blog/1847421http://heipark.iteye.com/blog/1847421http://wenku.baidu.com/vie ...

  8. cocos2d-x: 33种切换场景

    [1]:CCTransitionCrossFade::create(时间,目标场景); //慢慢淡化到还有一场景 [2]:CCTransitionFade::create(时间,目标场景); //本场 ...

  9. sqlalchemy操作

    Sqlalchemy ORM操作归类 #简单查询 #注意User是一个类对象,user_table是数据库中的表 #session = sessionmaker() #创建了一个自己定义了的 Sess ...

  10. Windows Phone开发(16):样式和控件模板

    原文:Windows Phone开发(16):样式和控件模板 在前面资源一文中也提过样式,样式就如同我们做HTML页排版时常用到的CSS样式表,它是对于特定娄型的可视化元素,应该可以直接说是针对控件的 ...