Java基础知识复习(二)

1.NPE(空指针异常):
指通过一个引用操作其指向的对象的属性或者方法时,该引用为null。
常见的几种空指针异常:
引用.属性
引用.方法
数组引用 Array[0] Array{}==null
synchronized(引用){}
2.MyLinkedList元素类型(String):
add(e) 尾插
add(index,e) 在index位置添加e
remove(index) 删除index位置元素
remove(e) 删除第一个遇到的e
get (index) 返回index位置元素
set (index,e) 修改index位置元素
contain (e) 是否包含e
indexof(e) 返回第一个e的下标,找不到就返回-1
LastIndexof(e) 从后面找,返回第一个e的下标
3.链表方法要不要使用static
首先要判断这个方法是不是和该类对象有关系
以add方法为例,如果有两个链表对象,调用一个对象的add,期望不对另一个链表对象产生影响,说明add 方法和对象有关系,不应该使用static,所以说,凡是和对象有关系的方法和属性,都不应该使用static。
4.链表插入练习
先创建节点类,定义共用引用;

public class Node {
    String  val;
    Node  prev;
    Node  next;
    Node(String val){
        this.val=val;
    }
}

创建链表,实现尾插和指定节点插入;

public class MyLinkeList {
    private  Node head;
    private  Node last;
    private   int size;
    //尾插练习
   public boolean add(String e){
       //把元素添加到节点对象中
       Node node=new Node(e);
       //区分链表是否为空的情况
       if(head==null){
           //链表为空
           head=last=node;
       }else{
           //链表不为空
           node.prev=last;
           last.next=node;
           last=node;
       }
          return true;
   }
   //指定位置插入练习
public void add(int index, String e){
       if(index<0||index>size()) {
    throw new IndexOutOfBoundsException("下标越界"+index);
       }
           //把元素添加到节点对象中
       Node node =new Node(e);
       if(head==null){
           //index一定是0,否则在上面抛异常
           head=last=node;
       }else if(index==0){
           //头插
       node.next=head;
       head.prev=node;
       head=node;
       }else if(index==size()){
      //尾插
           node.prev=last;
           last.next=node;
           last=node;
       }else{
        Node prev=head;
        for(int i=0;i<index-1;i++){
            prev=prev.next;
        }
        //指定index节点插入
        Node next=prev.next;
        node.prev=prev;
        node.next=next;
        prev.next=node;
        next.prev=node;
       }
       size++;
}
    public int size(){
        return size;
    }
}

指定位置插入示意图:
在这里插入图片描述
5.链表删除练习

  //指定位置插入练习
public void add(int index, String e){
       if(index<0||index>size()) {
    throw new IndexOutOfBoundsException("下标越界"+index);
       }
           //把元素添加到节点对象中
       Node node =new Node(e);
       if(head==null){
           //index一定是0,否则在上面抛异常
           head=last=node;
       }else if(index==0){
           //头插
       node.next=head;
       head.prev=node;
       head=node;
       }else if(index==size()){
      //尾插
           node.prev=last;
           last.next=node;
           last=node;
       }else{
           Node prev = getpreviousByindex(index);
           Node next=prev.next;
        node.prev=prev;
        node.next=next;
        prev.next=node;
        next.prev=node;
       }
       size++;
}

    private Node getpreviousByindex(int index) {
        Node prev=head;
        for(int i=0;i<index-1;i++){
            prev=prev.next;
        }
        return prev;
    }
//指定位置删除节点练习
    public String remove(int index){
        if(index<0||index>size()) {
            throw new IndexOutOfBoundsException("下标越界"+index);
        }
        String v=null;//记录返回值
        //不越界有两种情况,链表只有一个元素和链表有多个元素
        //只有一个元素情况
        if(size()==1){
            head=last=null;
            v=head.val;
        }else if(index==0){
            //头删情况
            head=head.next;
            head.prev=null;
            v=head.val;
        }else if(index==size()-1){
            //尾删情况
            last=last.prev;
            last.next=null;
            v=last.val;
        }else{
       Node prev=getpreviousByindex(index);
       Node node=prev.next;
       Node next=node.next;
            prev.next=next;
            next.prev=prev;
            v=node.val;
        }
        size--;
       return v;
    }
    //删除第一个遇到的e练习
    public boolean remove(String e){
       Node current=head;
       while(current!=null){
           if(current.val.equals(e)){
               Node prev=current.prev;
               Node next=current.next;
               if(prev!=null){
                   prev.next=next;
               }else{
                   head =head.next;
               }
               if(next!=null){
                   next.prev=prev;
               }else{
                   last=last.prev;
               }
               size--;
               return true;
           }
           current=current.next;
       }
       return false;
    }
    public int size(){
        return size;
    }

6.递归问题
当面临一个问题规模为n的问题A,我们发现可以将这个规模为n的问题分解成一个或多个子问题,这些子问题也是A类问题,问题规模是m,m<n;
例子:
求X的阶乘:

 public int fac(int x){
           if(x==1){
               return 1;
           }else{
             return x*fac(x-1);  
           }
       }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值