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. DB2错误代码

    db2错误代码大全 博客分类: 数据库 sqlcode sqlstate 说明 000 00000 SQL语句成功完毕 01xxx SQL语句成功完毕,可是有警告 +012 01545 未限定的列名被 ...

  2. ARM裸编程系列---UART

    S5PV210 UART说明 通用异步收发器缩写UART,这是UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER.它被用来传送串行数据.当发送数据,CPU将 ...

  3. linux下golang

    linux下golang的配置 linux下golang的配置 之前开发golang一直在windows下,今天在linux下试了一下 ,遇到一些梗,比如go 找不到 sync包.花了一小时全部解决, ...

  4. 读书笔记:《梦断代码Dreaming in Code》

    读书笔记:<梦断代码Dreaming in Code> 拿到<梦断代码>书后,一口气翻了一遍,然后又用了3天时间仔细读了一遍,也不禁掩卷长叹一声,做软件难.虽难,仍要继续走下去 ...

  5. hdu2036 (计算多边形的面积)

    Input 输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1 ...

  6. Lua 与C 交换 第一篇

    编译 windows上编译lua源代码 cl /MD /O2 /W3 /c /DLUA_BUILD_AS_DLL *.c del *.o ren lua.obj lua.o ren luac.obj ...

  7. Cocos2D &amp; SpriteBuilder Developer Guide

    https://www.makegameswith.us/docs/#!/cocos2d/1.0/overview

  8. <EditText /> This text field does not specify an inputType or a hint

    我是一个警告,xml代码是: <EditText android:id="@+id/str_ipaddress" android:layout_width="wra ...

  9. 八月份 CUGBACM_Summer_Tranning 题解

    CUGBACM_Summer_Tranning4 比赛链接:http://vjudge.net/contest/view.action?cid=52230#overview 题解链接: F . HDU ...

  10. C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】

    STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...