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. like-minded 都有什么意思_百度知道

    like-minded 都有什么意思_百度知道 like-minded 都有什么意思

  2. 【剑指offer】复制的复杂链条

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26154691 题目描写叙述: 输入一个复杂链表(每一个节点中有节点值,以及两个指针,一个指 ...

  3. 网络安全审查制度即将推出 手机App安全加密成必定趋势

    年05月22日宣布,为维护国家网络安全.保障中国用户合法利益,中国即将推出网络安全审查制度,关系国家安全和公共利益的系统使用的.重要信息技术产品和服务,应通过网络安全审查.文章出处:*** 网络安全审 ...

  4. java List<Map> 排序问题

    Collections.sort(order_from_list, new Comparator<Map<Object, Object>>() { public int com ...

  5. c/c++中main函数参数讲解

    参考地址: http://blog.csdn.net/cnctloveyu/article/details/3905720 我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实 ...

  6. Learning Cocos2d-x for WP8(3)——文字篇

    原文:Learning Cocos2d-x for WP8(3)--文字篇 C#兄弟篇Learning Cocos2d-x for XNA(3)——文字篇 文字,是人类文明的象征. 文字显示,可用字符 ...

  7. Java 二次MD5 32位小写加密算法与php页面加密结果相同

    最近做的一个项目需要使用MD5加密算法,需要加密的参数有两个.自己先试了几次,算的结果为php页面的不一样,后来与写php页面的同事沟通后,了解到php页面的算法如下: action = " ...

  8. async和await用法

    原文:async和await用法 要理解async和await的用法,首先要了解Task相关知识,这里不做说明,因为这不是本文的重点. 如果你已经对Task很了解,那么如何使用async和await, ...

  9. POJ 3630 Phone List Trie题解

    Trie的应用题目. 本题有两个难点了: 1 动态建立Trie会超时,须要静态建立数组,然后构造树 2 推断的时候注意两种情况: 1) Tire树有133,然后插入13333556的时候.2)插入顺序 ...

  10. HDU2586 How far away ?(LCA模板题)

    题目链接:传送门 题意: 给定一棵树,求两个点之间的距离. 分析: LCA 的模板题目 ans = dis[u]+dis[v] - 2*dis[lca(u,v)]; 在线算法:详细解说 传送门 代码例 ...