JAVA LinkedList 数据结构学习

DDR3性能优化实战:如何用Xilinx MIG控制器实现800MHz稳定读写(7系列FPGA版) 本文深入探讨了在Xilinx 7系列FPGA上使用MIG控制器实现DDR3存储器800MHz稳定高速读写的实战优化技巧。文章聚焦于高级时序调优、Bank Machine调度策略、用户接口设计优化以及利用ILA进行信号完整性调试,旨在帮助工程师突破性能瓶颈,实现接近理论峰值的稳定带宽,并为进一步冲刺更高频率提供进阶调参指南。 阅读详情
 transient int size = 0;
 transient Node<E> first; //指向头结点
 transient Node<E> last; //指向尾节点
 两个构造函数:
  public LinkedList() {}
  //将c集合中的元素都放进list中
  public LinkedList(Collection<? extends E> c) {
    this();
    addAll(c);
}
方法:
//设置头结点;private 用户不能调用;实现过程,先Node<E> f = first;因为等下first要指向新的节点,然后Node<E> newNode = new Node<>(null,e,f); null位置表示newNode的prev指向,e表示该节点的元素,f表示next的指向;然后将fisrt指向newNode;判断原来的头结点f是否为空,为空的话last也指向newNode,否则将f的prev指向newNode.最后size和modCount自增。

private void linkFirst(E e) {
    final Node<E> f = first;
    final Node<E> newNode = new Node<>(null, e, f);
    first = newNode;
    if (f == null)
        last = newNode;
    else
        f.prev = newNode;
    size++;
    modCount++;
    }

//设置尾节点,没有权限修饰符,用户可以调用(以后没特别写明都说明可调用);实现方法和设置头结点类似,以下默写一遍;

void linkLast(E e){
     final Node<E> l = last;
     final Node<E> newNode = new Node<>(l, e, null);
     last = newNode;
     if( l == null) first = newNode;
     else l.next = newNode;
     size++;
     modCount++;
}

//在某个非空节点的前面插入新节点;参数有两个,要插入的元素和被插入的节点;先要声明一个节点指向该节点的prev,然后声明一个新节点,还要考虑原来的节点是不是头结点,是的话要要first指向新节点;

void linkBefore(E e,Node<E> succ){
final Node<E> pred = succ.prev;
final Node<E> newNode = Node<>(pred, e, succ);
succ.prev = newNode;
if(pred == null) first = newNode;
else pred.next = newNode;
size++;
modCount++; 
}

//移除非空首节点,private修饰,用户不能调用,removeFirst()调用;返回被移除节点的元素值;将头结点的元素值和next都设为null;

private E unlinkFirst(Node<E> f){
final E element = f.item;
final Node<E> next = f.next;
f.item = null;
f.next = null;
if(next == null) last == null;
else next.prev = null;
size--;
modCount++;
return element;
}

//移除尾节点,private修饰,返回元素值;

private E unlinkLast(Node<E> l){
final element = l.item;
final prev = l.prev;
l.item == null;
l.prev == null;
if(prev == null) first = null;
else prev.next = null;
size--;
modCount++;
return element;
}

//移除某个节点;返回元素值;要判断该节点是否是头结点或者尾节点

E unlink(Node<E> x){
final Node<E> prev = x.prev;
final Node<E> next = x.next;
final E element = x.item;
x.item = null;
if(prev == null) first = next;
else {
    pre.next = next;
    x.prev = null;//默写的时候忘了
    } 
if(next == null) last = prev;
else {
next.prev = prev;
x.next = null;
}
size--;
modCount++;
return element;
}

//返回首节点的元素值,在首节点为null时要抛出异常,抛出异常的代码就不写了;

public E getFirst(){
 final Node<E> f = First;
 return f.item;
}

//返回尾节点,同上

public E getLast(){
final Node<E> l = Last;
return l.item;
}

//移除首节点和尾,调用unlinkFirst和unlinkLast,首节点和尾节点为空时报错,疑问为什么不直接把unlinkFirst设为public用来调用

public E removeFirst(){
final Node<E> f = First;
return unlinkFirst(f);
}
public E removeLast(){
//省略
}

//增加首尾节点,调用linkFirst(E e)和linkLast(E e)

public void addFirst(E e){ linkFirst(e);}

public void addLast(E e){ linkLast(e);}

// 是否包含某元素

public boolean contains(Object o){return indexOf(o) != -1;}

//返回元素个数

public int size(){return size;}

//add方法同addLast作用一样,但返回值是boolean类型,由于LinkedList实现了Collection接口,所以需要这个

public boolean add(E e){
  linkLast(e);
  return true;
}

//移除list中该元素首次出现的位置,如果没有该元素,则没有改变

public boolean remove(Object o){
  if(o == null){
     for(Node<E> x = first; x != null; x = x.next){
        if(x.item == null) {
           unlink(x);
           return true;
        }
     }
  } else{
    for(Node<E> x = first; x != null; x = x.next){
       if(o.equals(x.item)){
          unlink(x);
          return true;
       }
    }  
  }
  return false;
}

//把集合中的所有元素加入到队列队尾,调用addAll( int index, Collection< ? extends E> c);

public boolean addAll(Collection< ? extends E> c){
   return addAll(size, Collection<? extends E> c);
}

//把集合总的元素插入到指定位置,要检查index是否超出范围; 新建一个数组a = c.toArray; 如果数组长度为0,则返回false; 然后新建两个Node来放当前index的节点succ,以及前一个节点pred;如果index是size,那么当前节点succ就是null,pred就是pred,否则succ是node(index),pred = succ.prev;

public boolean addAll(int index, Collection< ? extends E> c){
  checkPositionIndex(index);
  Object[] a = c.toArray();
  int numNew = c.length;
  if(numNew == 0) return false;
  Node<E> succ, pred;
  if(index == size){
    succ = null;
    pred = last; 
  }else {
    succ = node(index);
    pred = succ.prev;
  }
  //遍历a数组,赋值给o;先把a里面的元素都接到pred后面,最后succ的prev指向pred,pred的next指向succ;
  for(Object o : a){
     E e = (E) o; // 类型转换
     Node<E> newNode = new Node<>(pred, e, null);
     if(pred == null) 
       first = newNode;
     else
       pred.next = newNode; 
     pred = newNode;
  }

  if(succ == null) 
    last = pred;
  else{
    pred.next = succ;
    succ.prev = pred; 
   }
 size += numNew;
 modCount++;
 return true;
}

//将某个元素添加到指定位置,检查index是否超限,当index = size时,调用linkLast(e),else 调用 linkBefore(e);

public void add(int index, E element){
   checkPositionIndex(index);

   if(index == size)
   return linkLast(element);
   else
   return linkBefore( element, node(index));
}

//移除指定位置的节点。检查index是否超限,调用unlink(Node)

public E remove(int index){
  checkElementIndex(index); //这个和chekPositionIndex的区别是它不包括index==size的情况,它是检查该位置是否有元素,通常在移除的时候用来检查,而后者通常在添加的时候用来检查。
  return unlink(node(index));
}

//下面是一些检查是否超限的方法

private boolean isElementIndex(int index) {
        return index >= 0 && index < size;
}
private boolean isPositionIndex(int index) {
        return index >= 0 && index <= size;
}
private String outOfBoundsMsg(int index) {
        return "Index: "+index+", Size: "+size;
}
private void checkElementIndex(int index) {
        if (!isElementIndex(index))
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private void checkPositionIndex(int index) {
        if (!isPositionIndex(index))
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

//返回指定节点,通过编号找节点的时候用二分法,index超过一半就从尾巴开始往前找,小于一半就从头开始找

Node<E> node(int index){
  if( index < (size >> 1) ){
    Node<E> x = first;
    for( int i = 0; i < index; i++)
       x = x.next;
    return x;
  } else {
    Node<E> x = last;
    for( int i = size - 1; i > index; i--)
       x = x.prev;
    return x;
  }
}

//返回某个元素最早出现的位置, 下一个是返回最后出现的位置lastIndexOf, 只需要遍历的时候反过来遍历就行。

public int indexOf(Object o){
   int index = 0;
   if( o == null){
     for( Node<E> x = first; x != null; x = x.next ){
         if( x.item = null)
            return index;
         index++;
     }
   } else {
     for( Node<E> x = first; x != null; x = x.next){
         if( x.item = o )
           return index;
         index++;  
     } 
   }
   return -1;
}

//队列操作
//两个得到首节点元素的操作,区别是element()会在首节点为空的时候报错,因为它调用getfirst(),而 peek()会返回null

public E peek(){ //同peekFirst(), peekLast()只需把f = last就行
   final Node<E> f = first;
   return (f == null) ? null : f.item;
}

public E element(){
    return getfirst();
}

//得到并移除首节点

public E poll(){ //同pollFirst(), pollLast()只需把f = last就行
    final Node<E> f = first;
    return (f == null) ? null:unlinkFisrt(f);
}
publuc E remove(){ //同pop()
    return removeFirst();
}

//在队尾加上元素

public boolean offer(E e){
    return add(e);
}

//在队首(尾)插入元素

public boolean offerFirst(E e){
    addFirst(e);
    return true;
}
public boolean offerLast(E e){
    addLast(e);
    return true;
}

//往队首加一个元素

public void push(E e){
    addFirst(e);
}

//移除该元素第一次出现的节点,同move(Object o),removeLastOccurence(Object o)Node<E> x = last开始往回遍历就行

public boolean removeFirstOccurence(Object o){
     return move(0)
}
30分钟用 Restful ABAP Programming(RAP)模型开发一个支持增删改查的 Fiori 应用 2016年时,Jerry曾经写过一系列关于SAP Fiori Smart Template(现在更名为Fiori Elements了)的博客,介绍了所谓的MDD开发方法论 - Metadata Driven Development,即通过开发维护了对应annotation(注解)的CDS view,结合SAP WebIDE,能够花费最少的编程代价,就能够在短时间内获得一个支持增删改查的Fiori应...... 阅读详情

相关推荐

yocto系列讲解[实战篇]54 - 添加Qt5和生成带Qt5的SDK

为了满足读者盆友想看yocto如何添加qt5的需求,今天就开始尝试添加meta-qt5

fulinux的博客 3808

java集合系列——List集合之LinkedList介绍(三)

LinkedList是基于链表实现的,从源码可以看出是一个双向链表。除了当做链表使用外,它也可以被当作堆栈、队列或双端队列进行操作。不是线程安全的,继承AbstractSequentialList实现List、Deque、Cloneable、Serializable。

阿飞云漫步 9239

27、物联网中的量子密钥分发:安全通信新范式

本文探讨了物联网(IoT)快速发展所带来的安全挑战,并提出量子密钥分发(QKD)作为应对新兴威胁的新范式。文章详细介绍了QKD的基础原理、BB84协议的实现流程以及其在物联网中的应用前景,同时强调了安全专业人员提升技能、制定标准化指南以及跨学科合作的重要性。通过利用量子力学特性,QKD能够提供更高的通信安全性,抵御量子计算等未来威胁,为物联网的安全发展提供保障。

tequila的博客 138

JavaLinkedList类详解

LinkedList的使用例子: import java.util.*; public class LinkedListDemo { public static void main(String []args){ LinkedList list = new LinkedList(); list.add("one"); list.add("two"); l

tianmo2010的专栏 2万+

java集合之LinkedList详解

原文链接 [https://zhhll.com.cn/2021/java基础/集合/3.LinkedList详解/] LinkedList详解 LinkedList是List接口的一个主要的实现类之一。以java8为例来了解一下LinkedList的源码实现 继承关系 public class LinkedList<E> extends AbstractSequentialList<E>

Lxn2zh的博客 611

Java 集合(List与LinkedList)接口详解

List接口 List接口的定义 List interface List extends Collection 通过观察List接口的定义发现其继承得是Collection接口 List、Set、Queue接口继承的都是Collection接口 Collection接口常用方法 1. public boolean add(E e); //添加元素到集合 2. public boo...

赵炳泉的博客 7726

Java数据结构深入学习LinkedList

LinkedList是链表结构,相比于ArrayList的数组结构,链表的增删效率更高,不需要移动其他元素,但是查找效率没有数组高,数组查找元素可以根据索引下标快速获取,而链表只能逐个遍历。

Java技术攻略的博客 283

JAVA学习-数据结构-LinkedList

ArrayList 和 LinkedList都是List的实现类。ArrayList是通过维护一个数组实现,而LinkedList是通过维护链表实现的。 代码如下: (两个结构的方法差不多,不过有些方法的复杂度不同,取决于他们的内部数据结构) private ListNode headNode; private ListNode tailNode; private int ...

阿斯蒂芬的博客 253

从零开始带你学习Java中的数据结构之List和LinkedList

有序集合(也称为序列 )。 该界面的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。 与集合不同,列表通常**允许重复的元素**。 更正式地,列表通常允许元素e1和e2成对使得e1.equals(e2) ,并且如果它们允许空元素,它们通常**允许多个空元素**。 有人可能希望实现一个禁止重复的列表,当用户尝试插入时会抛出运行时异常,但是我们预计这种使用是罕见的。 该List接口放置额外的约定,超过在Collection指定接口上的iterat

匿名王同学的博客 433

java数据结构与算法学习LinkedList的实现

LinkedList是一个双向链表,是链表的一种特殊情况。链表有单链表、静态链表、双向链表、循环链表。单链表节点有一个数据域,一个指针域,其中指针域指向下一个节点。静态链表底层是一个数组和游标组成。数组中的第一个元素为空,第一个游标是数组中第一个为空的元素的下标;数组中最后一个元素也为空,最后一个游标是数组中第一个不为空元素的下标;游标为0的元素是静态链表最后一个元素。根据最后一个游标找到静态链表...

Zer01ne的博客 368

Java 数据结构】从零开始学习Java(Day23)ArrayList(动态数组)与LinkedList(双向链表)

一起从零开始成就Java大神

黎明前的黑暗最为深邃,但只要你坚持,曙光终会划破天际。 955

Java基础课程学习总结,使用LinkedList简单模拟队列数据结构和堆栈数据结构的实现

Java的集合框架中,学习了使用LinkedList类模拟队列数据结构和堆栈数据结构的实现 (1)队列数据结构的模拟 1.首先模拟队列数据结构,队列数据结构遵循先进先出(FIFO)的原则,创建模拟类,类名为:DuiLieDemo,实现代码为: import java.util.LinkedList; public class DuiLieDemo { private L

Kung_Chao的博客 715

Java学习日志(五): 集合的数据结构,List集合(List接口,LinkedList)

Java学习日志(五)集合的数据结构栈队列数组链表红黑树List集合List接口ArrayList集合Vector集合LinkedList集合 集合的数据结构 栈 特点:先进后出 队列 特点:先进先出 数组 特点:查询快,增删慢 链表 特点:查询慢,增删快 红黑树 特点:查询速度非常快 List集合 List接口 java.util.List接口 extends Collection接口...

Sakuraaaaaaa的博客 562

共同学习Java源代码--数据结构--LinkedList类(八)

public Iterator descendingIterator() {         return new DescendingIterator();     } 这个方法返回一个倒叙Iterator,倒叙Iterator在下面:       private class DescendingIterator implements Iterator {         pri

ccdust的博客 413

小肥柴慢慢学习数据结构笔记(Java篇)(2-1 单链表LinkedList

小肥柴慢慢学习数据结构笔记(Java篇)(2-1 单链表LinkedList)目录2-1 上代码2-2 代码细节2-3 源码阅读2-4 总结 目录 在 小肥柴慢慢手写数据结构(C篇)(2-1 单链表 SingleLinkedList self版实现(1))中我们实现了C版的单链表,后又学习了反转、快慢指针等知识点,还对比了严版教材的实现,现在用Java再写一遍,练习OOP。 注:代码参考刘大佬的github 2-1 上代码 MyLinkedList.java public class MyLinkedL

卷毛迷你猪的博客 327

如何把int[]变为List

用Arrays.asList(int[])会变成一个List<int[]>型的list可以用Arrays.stream(int[]).boxed().collect(Collectors.toList());

CodeMask的博客 2920

java hashmap源码学习一 属性、构造方法

java8中HashMap的主要结构由数组,单链表和红黑树组成。 HashMap有一个属性load_factor(加载因子),它控制hashmap在容量达到多满时(加载因子*容量)要进行扩容,默认为0.75。加载因子大可以节省空间,但会增加查询成本。 它的主要属性:// 默认容量为16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;// 最

CodeMask的博客 1469

Pieces

1.把数组的全部元素设置成某个值 Array.fill(a, 5) 第一个参数是数组,第二个是要设置的值

CodeMask的博客 739

java 数据结构与算法 BinaryTree二叉树编写

本二叉树可以通过迭代得到二叉树的高度、节点个数,通过迭代实现了前序中序后序遍历二叉树的方法,同时通过栈实现了非迭代的前序中序后序遍历二叉树的方法。import java.util.Stack;public class BinaryTree { TreeNode<String> root = null; public BinaryTree() { this.root =

CodeMask的博客 661

java疯狂讲义第四章练习题

1.按照取子字符串,中文占两个字节,英文占一个字节package practice;public class substring{ public static String getSubstring(String s, int start, int end){ String r = new String(s); String result = "";

CodeMask的博客 658

Java学习2 多态 强制类型转换 instanceof

1.多态java引用变量有两个类型,一是编译时的类型,二是运行时的类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象的类型决定。 两个类型不一致时,就会出现多态。public class BaseClass{ public int a = 10; public void base(){ System.out.println("父类普通方法"

CodeMask的博客 570

Java疯狂讲义第三章练习题

package practice;import java.util.Scanner; import java.lang.Math;public class DrawCircle{ public static void main(String[] args){ int radius; System.out.println("Please input a radi

CodeMask的博客 440

IEC 61124:2023 可靠性测试 - 恒定故障率和恒定故障强度的合规性测试 - 完整英文版(184页).rar

完整英文版 IEC 61124:2023 Reliability testing - Compliance tests for constant failure rate and constant failure intensity(可靠性测试 - 恒定故障率和恒定故障强度的合规性测试)。IEC 61124:2012 给出了许多优化的测试计划、相应的操作特性曲线和预期的测试时间。 此外,还给出了使用电子表格程序设计测试计划的算法,以及如何选择测试计划的指导。 该标准规定了测试观察值是否为:故障率、故障强度、故障时间(MTTF)和平均故障间隔时间(MTBF)的程序。

医学图像分割数据集:大脑MRI肿瘤图像分割数据【包含标注好的数据集、可视化代码、txt标签文本】

图像分辨率为:640*640,可用于细粒度分割数据格式:jpgmask标签格式:png标签信息(2类): 0:背景、1:肿瘤【具体的标签类别可以在classes txt文本中查看】运行show脚本即可查看gt在images上的掩膜结果数据集介绍:分为训练集、验证集、测试集训练集:images图片目录+masks模板目录,201张图片和201个对应的mask图像验证集:images图片目录+masks模板目录,600张图片和600个对应的mask图像网络分割可以参考:https://blog.csdn.net/qq_44886601/category_12102735.htmlyolov5的分割实战:https://blog.csdn.net/qq_44886601/article/details/139504744

上一篇: Python学习6
下一篇: java hashmap源码学习一 属性、构造方法
CodeMask
博客等级 码龄9年 2粉丝 20原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值