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. .net设计模式 - 单例模式

    DoNet设计模式实例之单例模式( Singleton Pattern) 一 : 单例模式的简介:(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只 ...

  2. .Net路(十三)导出数据库到EXCEL

    .NET出口Office文件(word,excel)有两种方法我明白.一个存储在导出的文件中server录以下.利用response输出到浏览器地址栏,直接打开:还有直接利用javascript来导出 ...

  3. Mysql 双向关联触发器

    双向关联触发器 //增加 delimiter // create trigger InsertDemo AFTER insert on vaccine.demo for each row Begin ...

  4. C++——STL中三种顺序容器的简要差别

    C++ STL 提供了3个顺序容器 :vector, deque, list Vector动态数组.支持高速訪问:list双向链表,支持高速插入和删除. vector 中的元素是顺序存放的.所以随机訪 ...

  5. (Android+IOS)我们正在做一个新闻App,做几乎一样的,倾听您的建议 (画画)

    (Android+IOS)我们正在做一个新闻App,做几乎一样的,倾听您的建议! 新闻采访是做,前端展示APP界面感觉还不是非常好,还须要改进改进,希望公布(Android和IOS版本号)前听听大家的 ...

  6. hdu 1698 Just a Hook(线段树之 成段更新)

    Just a Hook                                                                             Time Limit: ...

  7. Windows Server 架设VPN要点

    PPTP 为给客户端连接的VPN用户帐户设置“允许拨入”属性. VPN服务端与客户端都无需安装任何证书. L2TP/IPSEC VPN服务器与客户端分别需要在自己的“本地计算机帐户>个人”(而非 ...

  8. MVC区域 vs2013 mvc 搭建基架项

    http://www.it165.net/pro/html/201404/12822.html

  9. GUI & Event例子

    Student No.: _______________ Name: ________________________________________1TK2934 Object-Oriented P ...

  10. Java Map 迭代

    Map迭代 有两种 道路 遍历 Map该方法:      1  Set<K> KeySet(): 获取全部的键,得到set集合,迭代, 通过get( key)获取值!      2  Se ...