11.05

一.做题错误

1

思路:这里我认为static是类里的静态方法,所以直接用 类名.方法(静态) 才是正确的,,所以我选了C

但是这种情况编译器是察觉不到的,并可以正确编译与运行

hello方法是一个静态方法,调用静态方法不需要创建实例对象。

此时的 Test test=null; 表示test这个引用不指向任何对象。所以此处可以正常访问。

但是我们需要牢记,静态方法的正确访问方式应该是用过类型来访问。即:Test.hello()

2.

3.

做题首先找main函数.此题先定义了一个对象,在堆上,但是对象对应的类中的x是私有变量是不可以直接操作的,

因为如果一个成员变量被static修饰,那他所在的数据是在方法区的,对象是在堆上是.

  1. 本题中的静态成员变量x,属于类变量,只有一份。所有对x的操作针对的都是同一份。
  2. 静态成员变量的访问需要通过类名访问,这是正确的访问方式。本题中虽然使用了对象引用访问,但是不会报错,我们不建议这样访问,但不是错误,所以,不会编译报错。

二.编译错误和运行错误的区别

1.错误

  错误(error)指程序运行时遇到的硬件错误,或者操作系统、虚拟机等系统软件错误或操作错误;

  错误对于程序而言是致命的;

  程序本身不能处理错误,只能依靠外界敢于,否则会一直处于非正常状态。如:没有找到.class文件或者文件中没有main()方法等;

  java.lang.Error是错误类,产生错误时,java虚拟机生成并抛出Error类对象。如:没有main方法产生NoClassDefFoundError,使用new分配内存时,没有可用内存产生OutOfMemoryError.

2.异常

  异常实质在硬件、操作系统或虚拟机等系统软件运行正常时,程序产生的运行错误;

  异常对于程序是非致命的;

  异常处理机制能使程序捕捉和处理异常,由异常处理代码调整程序运行方向继续运行;

  java.lang,Exception异常类是所有异常类 所后构成树层次结构的根类。

  Java定义异常类主要分为运行异常和非运行异常。运行异常是指由程序本身错误或数据错误引发的异常,这类异常程序设计时大多可以避免;非运行异常是指由程序运行环境错误引发的异常,这类异常必须捕获并处理。

3.编译错误和运行错误的区分

1.编译错误一般指语法错误或者很明显的逻辑错误。

如:缺少分号,少写括号......

在eclipse往往会画红线;

2.运行错误是在没有编译错误的基础上运行后产生的错误。

如:空指针异常,除数为0......

三.双向链表的构成

多了一个尾结点

四.双向链表同时删除所有key的元素

这里我又放了个及其离谱的错误

数据结构还是得多画图,第二种情况.对于cur进行操作,但是head还在指向第一个对象,head是一个成员变量,所以head还一直连接在前面的节点,根本没有删除,所以一定要细心

结果就是前面几个都没删除,因为头结点一直在;连接,没有变化

解答疑惑

如果cur和head同时指向一个节点(在堆上),那么cur和head的操作都会改变这个节点的值,但是cur=cur.next,是cur自己往前移动一位.并不代表head也移动,因为head和cur都是栈上开辟的内存.都是引用变量,cur=cur.next

指的是cur对第一个节点的引用取消,并指向了下一个节点,但是在栈上的head对第一个节点的引用还在啊.真是太糊涂了!!!!

我的方法

public void delFirst(int key) {
    if (head == null) {
        System.out.println("空的");
        return;
    }
    if (head.val == key) {
        head = head.next;
        if (head != null) {
            head.prev = null;
        } else {
            last = null;//不要忘记还有一个last
        }
        return;
    }
    Node cur = this.head.next;
    //while(cur.next!=null){//除了最后一个节点都能判断
    while (cur.val != key) {

        cur = cur.next;
    }
    if (cur.next != null) {
        cur.prev.next = cur.next;
        cur.next.prev = cur.prev;
    } else {
        cur.prev.next = null;
        this.last = this.last.prev;
    }
}

我这里如果放在删除所有的key是行不通的,因为如果第一个开始有很多要删除的,就不能构成循环,我的循环是建立在不包括第一各节点的,所以不够好,而第一种方法把所有可能都包含在一个循环,一开始就进入了循环,

我的代码可读性好,但是变通性差.

/    if (head == null) {
        System.out.println("空的");
        return;
    }
    Node cur = this.head;
    while (cur.next != null) {
        if (cur.val == key) {
            if (cur == head) {
                head = head.next;
                if (cur == null) {
                    this.last = null;
                    return;
                } else {
                    head.prev = null;
                }
            } else {
                cur.prev.next = cur.next;
                if (cur.next == null) {
                    this.last = cur.prev;
                }
            }
            cur = cur.next;
        }

    }
}

五.在index插入节点

/

//在index的位置插入一个节点
public void insertNode(int index,int data){
    if(index<0||index>length()-1){
        System.out.println("输入不合法");return;
    }
    if(this.head==null){
        System.out.println("表是空的");
        return;
    }
    Node node=new Node(data);
    Node cur=this.head;
    while(index!=0){
        cur=cur.next;
        index--;
    }
    if(cur==head){
        addFirst(data);return;
    }
    if(cur==last){
        addLast(data);return;
    }//到这里已经排除了头和尾.要改变四个yu
    cur.prev.next=node;
    node.next=cur;
    cur.prev=node;
    node.prev=cur;//最好按照先管后面的再管前面的不然容易出错.

}
//找寻index位置的节点
public Node findIndex(int index){
    if(index<0||index>length()-1){
        System.out.println("输入不合法");return null;
    }
    Node cur=this.head;
    while(index!=0){
        cur=cur.next;
        index--;
    }
    return cur;
}

六.清空链表'

这两种方法.明显第一种更好,第二种出了循环,head还在最后一个节点,不能保证一个循环下来,head和curNext在一个位置.如果是麻烦的题目就会容易弄乱

七.链表总结

面试问题的总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值