链表是一种物理存储单元上非连续、非顺序的存储结构。

链表是由那几个部分组成的呢?
 是由N个节点组成的
       每一个节点分为两部分:
                         1.数据域
                         2.指针域

数据域用来存储数据,指针域用来链接各个链表。

public class Node<E> {

    private E e;// 数据域
private Node<E> next;// 引用域 public Node() {
} public Node(E e) {
this.e = e;
} public E getE() {
return e;
} public void setE(E e) {
this.e = e;
} public Node<E> getNext() {
return next;
} public void setNext(Node<E> next) {
this.next = next;
}
public class MyLinkedList<E> {

    //声明头节点
private Node<E> root;
private int size;//声明单链表中存储的节点数 public MyLinkedList(){
root = new Node<E>();//实例化头节点
} /**
* 向链表中添加元素的方法
* @param e要添加的元素
*/
public void add(E e){
//根据e实例化了一个新的节点对象
Node<E> node = new Node<E>(e); //获取root的下一个节点
Node<E> tnode = root.getNext(); root.setNext(node);//将新的节点作为root的下一个节点 node.setNext(tnode);//将root原来的下一个节点作为新增加节点的下一个节点 size++;//记录添加的节点数
} /**
* 删除指定索引位置的元素
* @param index索引位置
* @return 返回删除的元素
*/
public E remove(int index){
if(index <= 0 || index > size)
return null;
//获取要删除节点的前一个节点
Node<E> node = select(index-1);
//获取要删除的节点
Node<E> dNode = node.getNext();
//获取要删除节点的后一个节点
Node<E> nNode = dNode.getNext(); //先建立删除节点的前一个节点和删除节点的后一个节点的关系
node.setNext(nNode);
//清除dNode的下一个节点
dNode.setNext(null); size--;//计数器减一 return dNode.getE();//返回删除节点中的数据域
} /**
* 获取指定索引位置的元素
* @param index索引位置
* @return 返回节点中的数据域
*/
public E get(int index){
if(index <= 0 || index > size)
return null;
//查找指定索引位置的节点对象
Node<E> node = select(index);
//获取节点中的数据域元素并返回
return node.getE();
} /**
* 获取单链表中存储的元素总数
* @return 返回size属性
*/
public int size(){
return size;
} /**
* 获取指定索引位置的节点对象
* @param index索引位置
* @return 返回获取到的节点对象
*/
private Node<E> select(int index){
Node<E> node = root.getNext();//将头节点的下一个节点赋给node
if(index==1)//如果index是1表示是头结点的下一个节点
return node;//直接返回node
for(int i=1;i<index;i++){
node = node.getNext();//获取node的下一个节点
}
return node;
} }

上面所述的是我们的单向链表,但是同时也具有双向的链表。

public class Node<E> {

    private E e;// 数据域
private Node<E> next;// 引用域
private Node<E> last;//引用域 public Node() {
} public Node(E e) {
this.e = e;
} public E getE() {
return e;
} public void setE(E e) {
this.e = e;
} public Node<E> getNext() {
return next;
} public void setNext(Node<E> next) {
this.next = next;
}
public Node<E> getLast(){
return last;
}
public void setLast(Node<E> last){
this.last = last;
} }

这上面就是双向链表的链表结构,我们也就是仅仅的添加了两个功能和一个变量而已,这个变量就是节点的上一个节点。而新的功能就是查找节点的上一节点的能力。

java之链表的更多相关文章

  1. JAVA单向链表实现

    JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...

  2. Java单链表反转 详细过程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...

  3. Java 单向链表学习

    Java 单向链表学习 链表等同于动态的数组:可以不同设定固定的空间,根据需要的内容动态的改变链表的占用空间和动态的数组同一形式:链表的使用可以更加便于操作. 链表的基本结构包括:链表工具类和节点类, ...

  4. java 单链表 练习

    练习一下java单链表的简单习题 package com.test1; import java.util.Stack; public class SingleListDemo { /** * 返回单链 ...

  5. java ListNode 链表

    链表是一种数据结构:由数据和指针构成,链表的指针指向下一个节点. java ListNode 链表 就是用Java自定义实现的链表结构. 基本结构: class ListNode { //类名 :Ja ...

  6. Java单链表反转图文详解

    Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...

  7. java实现链表

    单链表 package com.voole.linkedlist; public class Test { public static void main(String[] args) { Linke ...

  8. Java关于链表的增加、删除、获取长度、打印数值的实现

    package com.shb.java; public class Demo8 { public Node headNode = null; /** * @param args * @date 20 ...

  9. Java单链表的实现

    将结点Node进行封装,假设Node的操作有增加,删除,查找,打印几个操作.将Node实现为链表Link的内部类,简化代码. package Chapter5; import java.securit ...

  10. java单链表代码实现

    用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...

随机推荐

  1. R文件报错:cannot resolve symbol ‘R’

    今天仿照别人项目,因为不太熟悉Androidstudio,所以就照着他项目结构走,结果包名跟他的不一样,项目一直报标题这个错误,网上百度了很多也没用,不过先把网上的解决方案copy一下 请注意 ① E ...

  2. EF-按字段读取

    /// <summary> /// 直接获取特定一个或者多个字段的值 /// 多个字段需要声明Model /// var s= testDal.GetScalar<dynamic&g ...

  3. lucene搜索之facet查询原理和facet查询实例——TODO

    转自:http://www.lai18.com/content/7084969.html Facet说明 我们在浏览网站的时候,经常会遇到按某一类条件查询的情况,这种情况尤以电商网站最多,以天猫商城为 ...

  4. SQL Server 删除默认值

    alter table st_FuelConvertPatternSetting alter column tank_max_size decimal(5,2) not null declare @c ...

  5. 用css方法 可以实现多行 超出宽度 出点点点号

    overflow: hidden; -webkit-line-clamp: 2; display: -webkit-box; -webkit-box-orient: vertical;

  6. hibernate - 一级缓存和三种状态解析

    转载自:http://www.cnblogs.com/whgk/p/6103038.html 一.一级缓存和快照 什么是一级缓存呢? 很简单,每次hibernate跟数据库打交道时,都是通过sessi ...

  7. Wireshark图解教程(简介、抓包、过滤器)【转载】

    原文网址:http://blog.sina.com.cn/s/blog_5d527ff00100dwph.html Wireshark是世界上最流行的网络分析工具.这个强大的工具可以捕捉网络中的数据, ...

  8. [转]express 路由控制--next

    next() express的路由控制有个next()功能,在定义了多个路由的时候,对匹配的url会按顺序执行, 例如,有这样两个路由,第一个路由会对满足“/”的地址,在req中添加一个user的属性 ...

  9. asp.net过滤HTML标签,只保留换行与空格

    自己从网上找了一个过滤HTML标签的方法,我也不知道谁的才是原创的,反正很多都一样.我把那方法复制下来,代码如下: /// <summary> /// 去除HTML标记 /// </ ...

  10. Gradle 配置

    下载Gradle https://gradle.org/releases/ https://services.gradle.org/distributions/gradle-4.4.1-bin.zip ...