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. POJ 1088 滑雪 记忆化优化题解

    本题有人写是DP,只是和DP还是有点区别的,应该主要是记忆化 Momoization 算法. 思路就是递归,然后在递归的过程把计算的结果记录起来,以便后面使用. 非常经典的搜索题目,这样的方法非常多题 ...

  2. Django Form Media 阅读笔记

    ---恢复内容开始--- Form Media Rendering an attractive and easy-to-use Web form requires more than just HTM ...

  3. hdu3899(树形dp)

    题意:给一树,每个结点有人数,边有权值,表示经过这条边所需时间, 问取某个结点作为开会地点,所有人全部到达此结点最少所需总时间? 分析:val[u]表示以u为根节点的总人数,num[u]表示以u为根节 ...

  4. TSL230选型

    tsl230是一种可以直接将光强转化成频率值的器件.详细原理就不介绍了,数据手冊里写的都非常清楚,230系列包括非常多种,主要为下面四类:TSL230,TSL230A,TSL230B系列:TSL230 ...

  5. ie6下margin双倍距的问题

    今天中午休息时, 公司客服突然报出来一个bug, 一个用ie6的用户打开我们活动网站时, 发现内容都错乱了, 我赶紧上线一看, 发现是正常的. 找了台ie6的xp机器再看了下, 重现出了这个用户的问题 ...

  6. 在html中禁用自己主动完毕

    输入框输入内容时总是显示历史输入历史记录,现禁用的方法是加入一个属性: <input type="text name="txt_xm" autocomplete=& ...

  7. JSTL 中<c:forEach>使用

    <c:forEach 详解 博客分类: JSTL   <c:forEach>标签用于通用数据循环,它有以下属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 否 无 ...

  8. [WPF]DataGrid C#添加右键弹出选择菜单

    private void dataGrid_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { ContextMenu cont ...

  9. hdu2242(树形dp+tarjan+缩点)

    hdu2242 http://acm.hdu.edu.cn/showproblem.php?pid=2242 给定n,m表示n个点,m条边 每个点有个权值 问我们删除两某条边(割边)后将图分为两个部分 ...

  10. hdu1520 (树形dp)

    hdu1520 http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意是给定一棵树,每个结点有一个价值,要我们选择任意个结点使得总价值最大,规则是如果父亲结 ...