新手努力实现的--链表

package Mynode;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: czt20
 * Date: 2025 -12-09
 * Time: 8:21
 */
public class MyListnode implements IList{
    static class myliistnode{
      public int val;
      public myliistnode next;

        public myliistnode(int val) {
            this.val = val;
        }
    }
     public myliistnode head;
    public void creatlist(){
        myliistnode node1=new myliistnode(12);
        myliistnode node2=new myliistnode(23);
        myliistnode node3=new myliistnode(34);
        myliistnode node4=new myliistnode(45);
        myliistnode node5=new myliistnode(56);
        node1.next=node2;
        node2.next=node3;
        node3.next =node4;
        node4.next=node5;
        head=node1;
    }

    public  myliistnode middlenode(){
        if (head ==null){
            return null;
        }
        myliistnode fast=head;
        myliistnode slow=head;
        while(fast !=null && fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
        }
        return slow;
    }
    public void resverlist(){
        if (head==null){
            return;
        }
        myliistnode cur=head.next;
        head.next=null;
        while (cur != null){
            myliistnode curN=cur.next;
            cur.next=head;
            head=cur;
            cur=curN;
        }
        return;
    }
    @Override
    public void display() {
        myliistnode ct=head;
        while(ct!=null){
            System.out.print(ct.val+" ");
            ct=ct.next;
        }
    }

    @Override
    public void addFirst(int data) {
        myliistnode node=new myliistnode(data);
        node.next=head;
        head=node;
    }

    @Override
    public void addLast(int data) {
        if (head==null){
            myliistnode node = new myliistnode(data);
            head=node;
        }else {
            myliistnode cur = head;
            while (cur.next != null) {
                cur = cur.next;
            }
            myliistnode node = new myliistnode(data);
            cur.next = node;
        }
    }

    @Override
    public void addIndex (int index, int data)throws overread {
        int len=size();
                try{
                    if (index<0||index>len){
                        throw  new overread();
                    }
        }catch (Exception e){
            System.out.println("输入错误!!!!");
            e.getMessage();
        }
       if (index==0){
           addFirst(data);
           return;
       }
       if (index==len){
           addLast(data);
           return;
       }
       //中间插入
        myliistnode node=new myliistnode(data);
        myliistnode cur =head;
        while (index-1!=0){
            cur=cur.next;
            index--;
        }
        node.next=cur.next;
        cur.next=node;

    }

    @Override
    public boolean contains(int key) {
        myliistnode cur =head;
        while (cur!=null){
            if (cur.val==key){
                return  true;
            }
            cur=cur.next;
        }
        return false;
    }

    @Override
    public void remove(int key) {
     if (head==null){
         return;
     }
     if (head.val==key){
         head=head.next;
         return;
     }
     myliistnode cur=tofindremovenode(key);
     if (cur==null){
         System.out.println("没有找到要删除的数!!!!");
         return;
     }
     myliistnode delt=cur.next;
     cur.next=delt.next;
    }
   private myliistnode tofindremovenode(int key){
        myliistnode cur=head;
        while (cur.next!=null){
            if (cur.next.val==key){
                return cur;
            }
            cur=cur.next;
        }
        return  null;
   }
    @Override
    public void removeAlley(int key) {
     if(head==null){
         System.out.println("链表错误!!!");
         return;
     }
     myliistnode prev=head;
     myliistnode cur = prev.next;
     while (cur!=null){
         if (cur.val==key){
             prev.next=cur.next;
             cur=cur.next;
         }else {
             prev=cur;
             cur=cur.next;
         }
     }
     if (head.val==key){
         head=head.next;
     }
    }

    @Override
    public int size() {
        myliistnode cur=head;
        int count=0;
        while(cur!=null){
          count++;
          cur=cur.next;
        }
        return count;
    }

    @Override
    public void clear() {

        head.next=null;
        head=null;
    }
    public static void main(String[] args) {
    MyListnode a=new MyListnode();
        a.addFirst(1);
        a.addFirst(2);
        //a.addFirst(3);
        a.addFirst(4);
        a.addFirst(5);
        a.display();
        System.out.println();
        MyListnode.myliistnode b=a.middlenode();
        System.out.println(b.val);
    }
}

package Mynode;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: czt20
 * Date: 2025 -12-09
 * Time: 21:59
 */
public class overread extends RuntimeException{
    public overread(){
        super();
    }
   public  overread(String s){
        super(s);
   }

}

package Mynode;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: czt20
 * Date: 2025 -12-09
 * Time: 8:21
 */
public interface IList {
    public void addFirst(int data);
    public void addLast(int data);
    public void addIndex(int index,int data);
    public boolean contains(int key);
    public void remove(int key);
    public void removeAlley(int key);
    public int size();
    public void clear();
    public void display();
}

全部评论

相关推荐

12-08 12:43
已编辑
门头沟学院 Java
那些杀不死我的&nbsp;反复追着我杀!!1.jvm包含哪几部分classloader:将编译(.java-&gt;.class)好的java字节码文件(.class文件)&nbsp;加载到内存中(也就是运行时数据区Runtime&nbsp;data&nbsp;area&nbsp;存放运行时数据(线程私有:栈&nbsp;本地方法栈&nbsp;pc&nbsp;,进程级(也就是所有线程共享):堆&nbsp;本地方法区)Execution&nbsp;engine&nbsp;执行引擎,class文件被加载后&nbsp;将指令和数据放在内存中&nbsp;执行引擎负责将命令解释给os&nbsp;也就是将JVM指令翻译为os指令集Native&nbsp;interface:本地库接口2.jvm内存结构/运行时数据区线程私有的:栈(每个方法执行时创建栈帧&nbsp;存局部变量表等)&nbsp;本地方法栈(为Native方法提供服务)&nbsp;程序计数器(存当前线程执行的字节码指令地址)线程共享:堆(最大的内存区&nbsp;存对象实例、类对象)&nbsp;方法区&nbsp;(存类有关的信息&nbsp;静态变量等)3.说一下永久代和元空间都是对&nbsp;方法区&nbsp;的实现永久代:JDK7&nbsp;及之前的实现,属于堆内存的一部分,有固定大小限制(通过-XX:PermSize/-XX:MaxPermSize设置),存储类元信息、常量池等,易触发永久代&nbsp;OOM元空间:JDK8&nbsp;及之后的实现,使用本地内存(不在堆中),大小受物理内存限制(默认无上限),仅需通过-XX:MetaspaceSize设置初始触发&nbsp;GC&nbsp;的阈值4.为什么jdk8要将永久代替换为元空间解决永久代OOM问题&nbsp;简化类元数据管理&nbsp;兼容JVM规范5.类加载过程加载:通过类全限定名获取字节码流,将字节码转化为方法区的类元数据,同时在堆中生成Class对象验证:确保字节码符合&nbsp;JVM&nbsp;规范(如文件格式验证、语义验证),防止恶意字节码破坏&nbsp;JVM&nbsp;安全准备:为类的静态变量分配内存并赋默认值(如&nbsp;int&nbsp;赋&nbsp;0、对象赋&nbsp;null),不执行赋值语句(赋值在初始化阶段)解析:将常量池中的符号引用替换为直接引用(如类、方法的内存地址),该阶段可延迟到初始化后执行。初始化:执行&lt;clinit&gt;方法(静态变量赋值&nbsp;+&nbsp;静态代码块),触发时机是&nbsp;“主动使用”(new&nbsp;对象、访问静态成员、反射、初始化子类、主类),且每个类仅初始化一次6.类加载机制(双亲委派制)1类加载器收到加载请求&nbsp;&nbsp;-&gt;&nbsp;2将请求委托给父加载器,一直向上委托,直到启动类加载器&nbsp;-&gt;&nbsp;3启动加载器检查是否能加载这个类,能则使用当前加载器,否则向下传递&nbsp;-&gt;4重复步骤3&nbsp;如果找不到&nbsp;class&nbsp;not&nbsp;foundJVM&nbsp;默认类加载器层级:启动类加载器(Bootstrap)→扩展类加载器(Ext)→应用程序类加载器(App)→自定义类加载器7.why双亲委派保护核心类库(如String由启动类加载器加载,避免自定义类篡改替换)防止类重复加载8.自定义类加载器需要注意什么重写findClass方法(not&nbsp;loadClass,避免破坏双亲委派)9.双亲委派模型有哪些破坏场景&nbsp;为什么要破坏Tomcat的WebAppClassLoader:Tomcat&nbsp;为每个&nbsp;Web&nbsp;应用创建独立类加载器,优先加载应用内的类(而非委托父类),目的是隔离不同&nbsp;Web&nbsp;应用的类(防止不同应用的同包同类冲突)JDBC&nbsp;的&nbsp;SPI&nbsp;加载:JDBC&nbsp;的核心接口java.sql.Driver由启动类加载器加载,但具体实现(如&nbsp;MySQL&nbsp;驱动)在第三方包,启动类加载器无法加载,因此&nbsp;DriverManager&nbsp;通过线程上下文类加载器(破坏双亲委派)加载实现类(可能会让详细说一下SPI机制一些热部署实现:自定义类加载器加载更新后的类10.类卸载条件类所有实例被完全回收&nbsp;类加载器被完全回收&nbsp;Class对象无任何引用(FullGC时发生11.介绍一下gc机制涉及对象可回收判定、垃圾收集算法、分代收集模型、垃圾收集器、GC&nbsp;触发时机等维度(问这么大&nbsp;吟唱启动12.常见gc算法标记-清除,标记-复制,标记-整理,分代收集13.介绍一下CMS和G1(1)CMS&nbsp;收集器(老年代专用)核心流程:初始标记(STW,标记&nbsp;GC&nbsp;Roots&nbsp;直接关联对象)→并发标记(无&nbsp;STW,遍历引用链)→重新标记(STW,修正并发标记的遗漏)→并发清除(无&nbsp;STW,清理可回收对象)优点:并发收集,STW&nbsp;时间短,适合低延迟场景缺点:产生内存碎片、CPU&nbsp;消耗高(并发阶段占用&nbsp;CPU)、依赖老年代空间预留(易触发&nbsp;Full&nbsp;GC)(2)G1&nbsp;收集器(全堆收集)核心流程:将堆划分为多个大小相等的&nbsp;Region,包含新生代&nbsp;Region&nbsp;和老年代&nbsp;Region;流程为初始标记→并发标记→最终标记→筛选回收(STW,优先回收垃圾多的&nbsp;Region)优点:兼顾吞吐量和延迟、可预测&nbsp;STW&nbsp;时间(通过-XX:MaxGCPauseMillis设置)、无内存碎片(回收时整理&nbsp;Region)缺点:内存占用高(维护&nbsp;Remembered&nbsp;Set)、小内存场景下性能不如&nbsp;CMS14.jvm如何判断对象是可回收的早期方案引用计数法(无法解决循环引用问题)可达性分析算法判定对象是否不可达,结合引用类型细分可回收时机,finalize&nbsp;机制完成最终判定15.能否将对象分配在栈上jvm针对“逃逸”做了优化分析对象的作用域是否逃出方法&nbsp;/&nbsp;线程,若逃逸则可直接分配在栈上&nbsp;无需gc16.jvm调优核心思路是什么监控&nbsp;分析&nbsp;参数调整&nbsp;验证17.一般会调整哪些jvm参数堆大小:-Xms2g&nbsp;-Xmx2g(初始堆&nbsp;=&nbsp;最大堆,避免堆动态扩展的开销)新生代大小:-Xmn512m(新生代占堆的&nbsp;1/4~1/3,过小会导致对象提前进入老年代)Survivor&nbsp;比例:-XX:SurvivorRatio=8(Eden:S0:S1=8:1:1,保证新生代对象有足够空间存活)晋升老年代年龄:-XX:MaxTenuringThreshold&nbsp;-XX:InitialTenuringThresholdGC&nbsp;收集器:-XX:+UseG1GC(默认推荐,兼顾吞吐量和延迟)、-XX:+UseZGC(低延迟场景)GC&nbsp;日志:-XX:+PrintGCDetails&nbsp;-Xloggc:gc.log(输出&nbsp;GC&nbsp;日志用于分析)元空间:-XX:MetaspaceSize=128m&nbsp;-XX:MaxMetaspaceSize=256m(限制元空间大小,避免元空间&nbsp;OOM)18.Jvm调优经验《没有经验!!》(回去等通知吧19.内存泄漏和OOM的区别?如何排查(1)内存泄漏:对象已无业务意义,但仍被引用(如ThreadLocal......),导致无法被&nbsp;GC&nbsp;回收,长期积累会引发&nbsp;OOM①&nbsp;jmap&nbsp;-dump:format=b,file=heap.hprof导出堆快照;②&nbsp;MAT分析快照,定位&nbsp;“无法回收的大对象”&nbsp;和&nbsp;“持有其引用的&nbsp;GC&nbsp;Roots&nbsp;③结合&nbsp;Arthas&nbsp;的jvm/heapdump命令定位泄漏代码(如静态&nbsp;Map&nbsp;未清理)(2)OOM:JVM&nbsp;内存不足(如堆&nbsp;/&nbsp;元空间&nbsp;/&nbsp;栈超出上限),无法为新对象分配内存,直接抛出&nbsp;OOM&nbsp;异常①&nbsp;看&nbsp;OOM&nbsp;类型(堆&nbsp;OOM&nbsp;/&nbsp;元空间&nbsp;OOM&nbsp;/&nbsp;栈&nbsp;OOM)②&nbsp;堆&nbsp;OOM&nbsp;分析对象分布(是否大对象过多)&nbsp;元空间&nbsp;OOM&nbsp;检查类加载数量(是否频繁动态生成类)&nbsp;栈&nbsp;OOM&nbsp;检查递归深度或线程数20.线上OOM问题如何排查21.如何分析gc日志22.线上频繁FullGC如何排查23.讲一下对jvm的理解(太大了&nbsp;上文内容挑一些吟唱24.jmmJava&nbsp;Memory&nbsp;Model&nbsp;Java&nbsp;内存模型,Java&nbsp;虚拟机规范中定义的一种抽象内存模型,并非物理内存的实际布局,其核心目标是解决多线程环境下的原子性、可见性、有序性问题,为多线程编程提供内存访问的一致性规则欢迎佬赐教上辈子🔪👨放🔥&nbsp;这辈子十月(底)秋招!!
查看23道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务