首页 > 其他分享 >Leetcode707. 设计链表

Leetcode707. 设计链表

时间:2023-10-16 23:57:51浏览次数:39  
标签:index Leetcode707 MyLinkedList val int next 链表 length 设计

题目描述

你可以选择使用单链表或者双链表,设计并实现自己的链表。

单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。

如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList 类:

MyLinkedList() 初始化 MyLinkedList 对象。
int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

示例

image

第一次提交的代码

class MyLinkedList {

    private int val;
    private MyLinkedList next;

    //指针指向最后一个节点
    private MyLinkedList last;
    //指针指向第一个节点
    private MyLinkedList first;
    //当前链表的长度
    private int length;

    public MyLinkedList() {
        next=null;
        //代表当前节点没有值
        val=-2;
        first=this;
        last=this;
        length=0;
    }

    public MyLinkedList(int val,MyLinkedList next){
        this.val=val;
        this.next=next;
    }

    public int get(int index) {
        //处理不合理的index值
        if(index<0||index>=length)return -1;

        MyLinkedList p=new MyLinkedList();
        p=this.first;
        while(index>0){
            p=p.next;
            index--;
        }

        return p.val;
    }

    public void addAtHead(int val) {
        if(this.val==-2){
            this.val=val;
            this.first=this;
            this.last=this;
        }
        MyLinkedList newNode=new MyLinkedList();
        newNode.next=this.first;
        newNode.val=val;
        this.first=newNode;
        this.length++;
    }

    public void addAtTail(int val) {
        int num=this.length-1;
        MyLinkedList p=new MyLinkedList();
        p=this.first;
        while(num>0){
            p=p.next;
            num--;
        }
        MyLinkedList newNode=new MyLinkedList();
        newNode.val=val;
        newNode.next=null;
        p.next=newNode;
        this.last=newNode;
        this.length++;
    }

    public void addAtIndex(int index, int val) {
        //处理不合理的index值
        if(index<0||index>=length)return;
        if(index==0){
            this.addAtHead(val);
            return;
        }
        MyLinkedList p=new MyLinkedList();
        p=this.first;
        int num=index-1;
        while(num>0){
            p=p.next;
            num--;
        }
        MyLinkedList newNode=new MyLinkedList();
        newNode.val=val;
        newNode.next=p.next;
        p.next=newNode;
        this.length++;
    }

    public void deleteAtIndex(int index) {

        MyLinkedList current=this.first;


        MyLinkedList pre =null;
        int num=index;
        while(num>0){
            pre=current;
            current=current.next;
            num--;
        }

        pre.next=current.next;

        this.length--;
    }
}

结果就是通过不了:(,我自己在设计的时候,总觉得每个对象里面都带有length,first,next指针这些东西好奇怪啊,膈应的慌,最后一些方法修改一下应该可以通过。唉,菜了菜了。

学习到的东西

我怎么就没想到重新创建一个对象呢!!!
这样就不膈应了,而且代码好些多了!!!
菜狗菜狗!!!

新代码

class LinkedNode{
    int val;
    LinkedNode next;

    LinkedNode(){
        this.next=null;
    }
    LinkedNode(int val){
        this.val=val;
        this.next=null;
    }
}

class MyLinkedList {

    int length;

    LinkedNode linkedList;

    public MyLinkedList() {
        this.length=0;
        this.linkedList=null;
    }

    public int get(int index) {
        //先行条件
        if(index<0||index>=this.length||this.length==0)return -1;

        LinkedNode p=this.linkedList;
        //将指针移动到对应索引的节点
        for (int i = 0; i < index; i++) {
            p = p.next;
        }

        return p.val;
    }

    public void addAtHead(int val) {
        this.addAtIndex(0,val);
    }

    public void addAtTail(int val) {
        this.addAtIndex(this.length,val);
    }

    public void addAtIndex(int index, int val) {

        //先行条件
        if(index<0||index>this.length)return;


        LinkedNode newNode=new LinkedNode(val);
        //插在第一个节点之前特殊处理
        if(index==0){
            newNode.next=this.linkedList;
            this.linkedList=newNode;
            //链表长度加+1
            this.length++;
            return;
        }

        LinkedNode current=this.linkedList;

        int num=index-1;

        //移动到指定节点之前的位置
        while(num>0){
            current=current.next;
            num--;
        }
        newNode.next=current.next;
        current.next=newNode;

        //链表长度加+1
        this.length++;
    }

    public void deleteAtIndex(int index) {
        //先行条件
        if(index<0||index>=this.length||this.length==0)return;
        LinkedNode pre=null;
        LinkedNode current=this.linkedList;


        //如果删除的是首位索引,需要特殊处理
        if(index==0){
            this.linkedList=this.linkedList.next;
            this.length--;
            return;
        }

        //current指针和pre指针先行移动到指定位置
        while(index>0){
            pre=current;
            current=current.next;
            index--;
        }

        pre.next=current.next;

        //链表长度减一
        this.length--;
    }
}

别人的方法把addAtHead和addAtTail这俩方法都用addAtIndex来处理的,我怎么就只想到把addAtHead用addAtIndex处理呢,菜狗!

标签:index,Leetcode707,MyLinkedList,val,int,next,链表,length,设计
From: https://www.cnblogs.com/whitePuPigeon/p/17768716.html

相关文章

  • 代码随想训练营第三天(Python) | 203.移除链表元素、707.设计链表、206.反转链表
    一、203.移除链表元素关键点:如何删除节点,需要知道删除节点前的节点。1、无虚拟头节点的方法classSolution:defremoveElements(self,head:Optional[ListNode],val:int)->Optional[ListNode]:whilehead!=Noneandhead.val==val:#如果头节点的值......
  • c#设计模式-行为型模式 之 访问者模式
    ......
  • Leetcode203.移除链表元素
    题目描述给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例提交的代码/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}......
  • 链表的头插和尾插(数组--链表)
    头插法代码示例publicclassLinkDemo{publicstaticvoidmain(String[]args){//将这个数组按头插的方式插入列表int[]arr={1,2,3,4,5,6,7,8,9};headIndert(arr);}publicstaticvoidheadIndert(int[]arr){Nodeli......
  • 设计模式02 —— UML
    设计模式02——UML本教程参考:菜鸟教程-学的不仅是技术,更是梦想!(runoob.com)参考书:《图解设计模式》本系列为本人学习笔记,和课程学习笔记,资料和参考均源自互联网,希望各位大佬多多指点!UML的概念UML的全称是UndefinedModelingLanguage(统一建模语言)是让系统可视化,让规格......
  • 系统分析与设计:
    瀑布开发系统规划每步都要确认验证系统分析系统设计软件编程系统测试系统运行反馈给以上类:抽象,鱼对象:具象,唯一,我手里那条鱼......
  • 设计原则
              ......
  • Java设计模式
    七大设计原则开闭原则:是指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭依赖倒置原则:是指设计代码结构时,高层模块不应该依赖底层模块,二者都应该依赖其抽象而不依赖于具体。单一职责原则:是指一个Class/Interface/Method只负责一项职责。接口隔离原则:是指用多个专......
  • 设计模式01 —— 设计模式简介
    设计模式01——设计模式简介本教程参考:菜鸟教程-学的不仅是技术,更是梦想!(runoob.com)为本人学习笔记,和课程学习笔记,希望各位大佬多多指点!设计模式的简介设计模式可以看作一套被人反复使用的,多人知晓的代码设计的经验总结。设计模式是软件工程的基石。以下是完全版:设......
  • 基于X86六轮差速移动机器人运动控制器设计与实现(二)规划控制算法
    带输入约束的MPC路径跟踪控制MPC算法是一种基于控制对象模型的控制方法,其优势在于在控制中考虑了系统的多种物理约束,同时基于模型与当前机器人的反馈信息预估出未来机器人位姿信息的处理方法可以解决控制迟滞的问题。4.1MPC路径跟踪控制器框架根据第......