java之链表
链表是一种物理存储单元上非连续、非顺序的存储结构。
链表是由那几个部分组成的呢?
是由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之链表的更多相关文章
- JAVA单向链表实现
JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...
- Java单链表反转 详细过程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...
- Java 单向链表学习
Java 单向链表学习 链表等同于动态的数组:可以不同设定固定的空间,根据需要的内容动态的改变链表的占用空间和动态的数组同一形式:链表的使用可以更加便于操作. 链表的基本结构包括:链表工具类和节点类, ...
- java 单链表 练习
练习一下java单链表的简单习题 package com.test1; import java.util.Stack; public class SingleListDemo { /** * 返回单链 ...
- java ListNode 链表
链表是一种数据结构:由数据和指针构成,链表的指针指向下一个节点. java ListNode 链表 就是用Java自定义实现的链表结构. 基本结构: class ListNode { //类名 :Ja ...
- Java单链表反转图文详解
Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...
- java实现链表
单链表 package com.voole.linkedlist; public class Test { public static void main(String[] args) { Linke ...
- Java关于链表的增加、删除、获取长度、打印数值的实现
package com.shb.java; public class Demo8 { public Node headNode = null; /** * @param args * @date 20 ...
- Java单链表的实现
将结点Node进行封装,假设Node的操作有增加,删除,查找,打印几个操作.将Node实现为链表Link的内部类,简化代码. package Chapter5; import java.securit ...
- java单链表代码实现
用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...
随机推荐
- Java-集合类源码List篇(二)
前言 上篇中,我们分析了ArrayList的常用方法及其实现机制.ArrayList是基于内存空间连续的数组来实现的,List中其实还提供了一种基于链表结构的LinkedList来实现集合.同时多线程 ...
- struts2常见配置解决错误There is no mapped for namespace[/] and action name
我碰到这个错误的原因是我把配置文件名写成了Struts.xml,改成struts.xml就可以了. 在确定struts.xml本身并没有写错的情况下,那么发生错误有可能是路径,配置文件名. 如果实在找 ...
- java学习笔记 --- 多线程(多线程的创建方式)
1.创建多线程方式1——继承Thread类. 步骤: A:自定义类MyThread继承Thread类. B:MyThread类里面重写run()? 为什么是run()方法呢? C:创建对象 D:启 ...
- 在winform中给GridView加checkbox在按钮点击的时候获取选中的checkbox
dataGridView绑定后 bool[] mark = new bool[this.dataGridView1.Rows.Count]; ; i < mark.Length; i++) { ...
- Leetcode 976. Largest Perimeter Triangle
送分题 class Solution(object): def largestPerimeter(self, A): """ :type A: List[int] :rt ...
- memcache应对缓存失效问题
.两个key,一个key用来存放数据,另一个用来标记失效时间 比如key是aaa,设置失效时间为30s,则另一个key为expire_aaa,失效时间为25s. 在取数据时,用multiget,同时取 ...
- 【集成学习】sklearn中xgboot模块中fit函数参数详解(fit model for train data)
参数解释,后续补上. # -*- coding: utf-8 -*- """ ############################################## ...
- 总结的一些MySQL数据库面试题
1.sql语句应该考虑哪些安全性? 1.防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量. 2.最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账 ...
- NOI 模拟赛 #3
打开题一看,咦,两道数数,一道猫式树题 感觉树题不可做呀,暴力走人 数数题数哪个呢?感觉置换比矩阵好一些 于是数了数第一题 100 + 0 + 15 = 115 T1 bishop 给若干个环,这些环 ...
- The Sum of 0 for four numbers(拆解加二分思想)
个人心得:单纯用二分法一直超时,后面发现我的那种方法并没有节省多少时间,后面看了大神的代码,真的是巧妙, 俩个数组分别装a+b,c+d.双指针一个指向最后,从第一个开始想加,加到刚好大于0停止,再看是 ...