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

链表是由那几个部分组成的呢?
 是由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. Java-集合类源码List篇(二)

    前言 上篇中,我们分析了ArrayList的常用方法及其实现机制.ArrayList是基于内存空间连续的数组来实现的,List中其实还提供了一种基于链表结构的LinkedList来实现集合.同时多线程 ...

  2. struts2常见配置解决错误There is no mapped for namespace[/] and action name

    我碰到这个错误的原因是我把配置文件名写成了Struts.xml,改成struts.xml就可以了. 在确定struts.xml本身并没有写错的情况下,那么发生错误有可能是路径,配置文件名. 如果实在找 ...

  3. java学习笔记 --- 多线程(多线程的创建方式)

    1.创建多线程方式1——继承Thread类. 步骤:  A:自定义类MyThread继承Thread类.  B:MyThread类里面重写run()? 为什么是run()方法呢? C:创建对象 D:启 ...

  4. 在winform中给GridView加checkbox在按钮点击的时候获取选中的checkbox

    dataGridView绑定后 bool[] mark = new bool[this.dataGridView1.Rows.Count]; ; i < mark.Length; i++) { ...

  5. Leetcode 976. Largest Perimeter Triangle

    送分题 class Solution(object): def largestPerimeter(self, A): """ :type A: List[int] :rt ...

  6. memcache应对缓存失效问题

    .两个key,一个key用来存放数据,另一个用来标记失效时间 比如key是aaa,设置失效时间为30s,则另一个key为expire_aaa,失效时间为25s. 在取数据时,用multiget,同时取 ...

  7. 【集成学习】sklearn中xgboot模块中fit函数参数详解(fit model for train data)

    参数解释,后续补上. # -*- coding: utf-8 -*- """ ############################################## ...

  8. 总结的一些MySQL数据库面试题

    1.sql语句应该考虑哪些安全性? 1.防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量. 2.最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账 ...

  9. NOI 模拟赛 #3

    打开题一看,咦,两道数数,一道猫式树题 感觉树题不可做呀,暴力走人 数数题数哪个呢?感觉置换比矩阵好一些 于是数了数第一题 100 + 0 + 15 = 115 T1 bishop 给若干个环,这些环 ...

  10. The Sum of 0 for four numbers(拆解加二分思想)

    个人心得:单纯用二分法一直超时,后面发现我的那种方法并没有节省多少时间,后面看了大神的代码,真的是巧妙, 俩个数组分别装a+b,c+d.双指针一个指向最后,从第一个开始想加,加到刚好大于0停止,再看是 ...