首页 > 其他分享 >day7

day7

时间:2022-11-01 21:58:02浏览次数:34  
标签:index val int day7 next MyLinkedNode size

[0707.设计链表]

class MyLinkedNode{
    int val;
    MyLinkedNode next;
    public MyLinkedNode (int val, MyLinkedNode next){
        val = this.val;
        next = this.next;
    }
}
class MyLinkedList {
    MyLinkedNode head;
         
    public MyLinkedList() {
         
    }
    
}
  • 开始弄了半天,竟然不知道leecode给出的这个MyLinkedList是链表(而不是链表结点),题目让写的是链表操作函数,因此我还需要先自己定义链表结点类MyLinkedNode,先生成结点》》》》然后才能初始化链表》》》》接着才有对链表的操作函数的自定义
class MyLinkedNode{
    int val;
    MyLinkedNode next;
    public MyLinkedNode (int val, MyLinkedNode next){
        val = this.val;
        next = this.next;
    }
}
class MyLinkedList {
    MyLinkedNode node;
    MyLinkedList shead;    
    public MyLinkedList() {
        MyLinkedNode node = new MyLinkedNode (-1 , null);
        this.shead = node;
    }

}

  • 首先,要注意C、C++、Java在同时自定义两个类、并其中一个会用到另一个类的情况下,各类的属性、构造函数初始化的写法有很大区别。详见代码。
  • 其次,对什么类定义-----就想这个类需要什么属性------而该属性对应什么类,按照这个思路就不会混淆了。(1)对结点定义---结点内的元素值、下一个结点地址值-----分别是int型、结点MyLinkedNode型(2)对链表定义---链表头指针(假的)、链表大小-------分别是MyLinkedNode型、int型。 上述代码我的错误是没考虑到链表大小。
  • 最后,关于类中的属性核构造函数的理解:(1)属性格式:类型 变量名;是不需要在这个地方赋值的。(2)构造函数:是对各个属性赋值(即初始化)
public int get(int index) { 
        MyLinkedNode pre = this.shead;
        MyLinkedNode cur = pre.next;
        while(cur != null){
            if(size == index){
                return cur.val;
            }
            pre = cur;
            cur = cur.next;
            size++;
        }
        if(cur == null){
            return -1;
        }
    }
  • 上面代码不需要pre指针,删去
class MyLinkedNode{
    int val;
    MyLinkedNode next;
    public MyLinkedNode (int val, MyLinkedNode next){
        val = this.val;
        next = this.next;
    }
}
class MyLinkedList {
    MyLinkedNode shead;  //指向头结点的指针
    int size;   // 所有元素(含虚拟头结点)的下标从0-size ,总元素(不含虚拟头结点)共size个  
    public MyLinkedList() {
        shead = new MyLinkedNode (-1, null);
        size = 0;
    }
    
    public int get(int index) { 
        MyLinkedNode cur = shead.next;
        while(cur != null){
            if(size == index){
                return cur.val;
            }
            cur = cur.next;
            size++;
        }
        return -1;
    }
    
    public void addAtHead(int val) {
        MyLinkedNode head = new MyLinkedNode(val , shead.next);
        shead.next = head;
        size ++;
    }
    
    public void addAtTail(int val) {
        MyLinkedNode tail = new MyLinkedNode(val , null);
        MyLinkedNode cur = shead;
        for (int i =1; i <= size; i++){
            cur = cur.next;
        }
        cur.next = tail;
        size ++;
    }
    
    public void addAtIndex(int index, int val) {    // index题目要求从0-index ,虚拟头结点是没有index值的
        if (index == size){
            MyLinkedNode tail = new MyLinkedNode(val , null);
            MyLinkedNode cur = shead;
            for (int i =1; i <= size; i++){
                cur = cur.next;
            }
            cur.next = tail; 
        }
        if (index < 0){
            MyLinkedNode head = new MyLinkedNode(val , shead.next);
            shead.next = head;
        }
        if (index >= 0 && index < size){
            MyLinkedNode p = new MyLinkedNode(val , null);
            MyLinkedNode cur = shead;
            MyLinkedNode pre = cur;
            for (int i = 0; i <= index; i++){
                pre = cur;
                cur = cur.next;
            }
            p.next = cur;
            pre = p;
        }
        size ++;       
    }
    
    public void deleteAtIndex(int index) {
        MyLinkedNode cur = shead;
        MyLinkedNode pre = cur;
        if (index >= 0 && index < size){
             for (int i = 0; i <= index; i++){
                 pre = cur;
                 cur = cur.next;
             }
        pre.next = cur.next;
        }
        size --;
    }
}

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList obj = new MyLinkedList();
 * int param_1 = obj.get(index);
 * obj.addAtHead(val);
 * obj.addAtTail(val);
 * obj.addAtIndex(index,val);
 * obj.deleteAtIndex(index);
 */
  • 搞清了属性核构造函数,结果还是有问题
class MyLinkedNode{
    int val;
    MyLinkedNode next;
    public MyLinkedNode (int val, MyLinkedNode next){
        val = this.val;
        next = this.next;
    }
}
class MyLinkedList {
    MyLinkedNode shead;  //指向头结点的指针
    int size;   // 所有元素(含虚拟头结点)的下标从0-size ,总元素(不含虚拟头结点)共size个  
    public MyLinkedList() {
        shead = new MyLinkedNode (-1, null);
        size = 0;
    }
    
    public int get(int index) { 
        if (index < 0 || index >= size){
            return -1;
        }
        MyLinkedNode cur = shead;
        for (int i = 0; i <= index; i++ ){
            cur = cur.next;
        }
        return cur.val;
    }
    
    public void addAtHead(int val) {
        addAtIndex (0 , val);
    }
    
    public void addAtTail(int val) {
        addAtIndex (size , val);
    }
    
    public void addAtIndex(int index, int val) {    // index题目要求从0-index ,虚拟头结点是没有index值的
        if (index > size)
            return ;
        if (index < 0){
            index = 0;
        }
        if (index == size){
            MyLinkedNode cur = shead;
            MyLinkedNode p = new MyLinkedNode (val , null);
            for (int i = 0; i <size; i++){
                cur = cur.next;
            }
            cur.next = p;
            size ++;
        } 
        if (index >= 0 && index < size){
            MyLinkedNode cur = shead;
            MyLinkedNode pre = cur;
            MyLinkedNode p = new MyLinkedNode (val , null);
            for (int i = 0; i <= index; i++ ){
                pre = cur;
                cur = cur.next;
            }
            pre.next = p;
            p.next = cur;
            size++;
        }  
    }
    
    public void deleteAtIndex(int index) {
        MyLinkedNode cur = shead;
        MyLinkedNode pre = cur;
        if (index < 0 || index >= size) {
            return;
        }
        if (index >= 0 && index < size){
             for (int i = 0; i <= index; i++){
                 pre = cur;
                 cur = cur.next;
             }
        pre.next = cur;
        }
        size --;
    }
}

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList obj = new MyLinkedList();
 * int param_1 = obj.get(index);
 * obj.addAtHead(val);
 * obj.addAtTail(val);
 * obj.addAtIndex(index,val);
 * obj.deleteAtIndex(index);
 */
  • 结果还是不对,我估计是插入函数出问题了
class MyLinkedNode{
    int val;
    MyLinkedNode next;
    MyLinkedNode(){}
    MyLinkedNode (int val){
        val = this.val;
    }
}
class MyLinkedList {
    MyLinkedNode shead;  //指向头结点的指针
    int size;   //   
    
    public MyLinkedList() {
        shead = new MyLinkedNode (0);
        size = 0;
    }
    
    public int get(int index) { 
        if (index < 0 || index >= size){
            return -1;
        }
        MyLinkedNode cur = shead;
        for (int i = 0; i <= index; i++ ){
            cur = cur.next;
        }
        return cur.val;
    }
    
    public void addAtHead(int val) {
        addAtIndex (0 , val);
    }
    
    public void addAtTail(int val) {
        addAtIndex (size , val);
    }
    
    public void addAtIndex(int index, int val) {    // index题目要求从0-index ,虚拟头结点是没有index值的
        if (index > size)
            return;
        if (index < 0){
            index = 0;
        }
        size++;
        //找到要插入节点的前驱
        MyLinkedNode pred = shead;
        for (int i = 0; i < index; i++) {
            pred = pred.next;
        }
        MyLinkedNode toAdd = new MyLinkedNode(val);
        toAdd.next = pred.next;
        pred.next = toAdd; 
    }
    
    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            return;
        }
        size--;
        if (index == 0) {
            shead = shead.next;
	    return;
        }
        MyLinkedNode pred = shead;
        for (int i = 0; i < index ; i++) {
            pred = pred.next;
        }
        pred.next = pred.next.next;
    }
}

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList obj = new MyLinkedList();
 * int param_1 = obj.get(index);
 * obj.addAtHead(val);
 * obj.addAtTail(val);
 * obj.addAtIndex(index,val);
 * obj.deleteAtIndex(index);
 */
  • 和标准答案一致但结果还是那两个数不对

  • [null,null,null,null,0,null,0] 答案:[null,null,null,null,2,null,3]

  • 我天!!!!是 this.val = val; 我前后给写反了!!!>-<

  • 上上一段代码确实插入函数有问题

标签:index,val,int,day7,next,MyLinkedNode,size
From: https://www.cnblogs.com/deservee/p/16849287.html

相关文章

  • 【leetcode_C++_字符串_day7】344_反转字符串&541_反转字符串II&&剑指Offer_05_替换空
    344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)......
  • 学习python-Day79
    昨日内容回顾前端发展历史vue react谷歌flutter,Dart语言uni-app:小公司vue:3.x2.x3.x====>ts2.x====>jsvue渐进式MVVMM层:model,数据层,jsV层:view,视......
  • 学习python-Day77
    今日学习内容一、⽬录结构说明1.⽬录结构发展过程一块盘:根目录二块盘:/usr目录继续扩展>>>:FHS文件系统目录规范2.重要目录数据信息说明网卡配置文件 /etc/sysc......
  • 【算法训练营day7】LeetCode454. 四数相加II LeetCode383. 赎金信 LeetCode15. 三数之
    【算法训练营day7】LeetCode454.四数相加IILeetCode383.赎金信LeetCode15.三数之和LeetCode18.四数之和LeetCode454.四数相加II题目链接:454.四数相加II初次尝......
  • 学习python-Day76
    今日学习内容一、虚拟机关键配置名词解释1.虚拟网络编辑器说明桥接模式​ 配置的地址信息和物理主机地址信息相同,容易造成地址冲突NAT模式​ 配置的地址信息和物......
  • 学习python-Day75
    运维的本质运维:运行维护应用程序岗位需求:自动化运维、DBA、docker+K8s...运维职责:尽可能保证应用程序24小时不间断运行尽可能保证数据的安全尽可能提升程序的......
  • 22 暑期C班 Day7—附加赛
    线段树什么的最讨厌了已经没有什么好害怕的了我才不是萝莉控呢......
  • 学习python-Day70
    今天学习内容一、自定义频率类fromrest_framework.throttlingimportBaseThrottleclassMyThrottle(BaseThrottle):VISIT_RECORD={}#存放用户访问记录{ip......
  • Java基础Day7-值传递和引用传递
    一、值传递Java都是值传递。值传递:是指在调用函数时,将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,就不会影响到实际参数。值传递是对基本数据类型而......
  • 代码随想录day7 ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四
    454.四数相加II暴力解法(超出时间限制):1classSolution{2public:3intfourSumCount(vector<int>&nums1,vector<int>&nums2,vector<int>&nums3,vecto......