• 设计链表-LeetCode707 基础题


    LeetCode链接:https://leetcode.cn/problems/design-linked-list/

    题目:设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。

    在链表类中实现这些功能:

    • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
    • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
    • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
    • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
    • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

    示例1:

    复制代码
    MyLinkedList linkedList = new MyLinkedList();
    linkedList.addAtHead(1);
    linkedList.addAtTail(3);
    linkedList.addAtIndex(1,2); //链表变为1-> 2-> 3
    linkedList.get(1); //返回2
    linkedList.deleteAtIndex(1); //现在链表是1-> 3
    linkedList.get(1); //返回3
    复制代码

    思路

        删除链表节点:

            

        添加链表节点:

            

        这道题目设计链表的五个接口:

    1. 获取链表第index个节点的数值
    2. 在链表的最前面插入一个节点
    3. 在链表的最后面插入一个节点
    4. 在链表第index个节点前面插入一个节点
    5. 删除链表的第index个节点

        可以说这五个接口,已经覆盖了链表的常见操作,是练习链表操作非常好的一道题目

        链表操作的两种方式:

    1. 直接使用原来的链表来进行操作。
    2. 设置一个虚拟头结点在进行操作。

        下面采用的设置一个虚拟头结点(这样更方便一些,大家看代码就会感受出来)

    java代码如下:

    复制代码
    class ListNode{
        int val;
        ListNode next;
        ListNode(){}
        ListNode(int val){
            this.val=val;
        }
    }

    class MyLinkedList {
        int size;
        ListNode head;

        public MyLinkedList() {
            size=0;
            head=new ListNode(0);    
        }
        
        public int get(int index) {
            if(index<0 ||index>=size){
                return -1;
            }
            ListNode curr=head;
            for(int i=0; i<=index; i++){
                curr=curr.next;
            }
            return curr.val;
        }
        
        public void addAtHead(int val) {
            addAtIndex(0,val);
        }
        
        public void addAtTail(int val) {
            addAtIndex(size,val);
        }
        
        public void addAtIndex(int index, int val) {
            if(index>size){
                return;
            }
            if(index<0){
                index=0;
            }
            size++;
            ListNode curr=head;
            ListNode ne=new ListNode(val);
            for(int i=0; i
                curr=curr.next;
            }
            ne.next=curr.next;
            curr.next=ne;
        }
        
        public void deleteAtIndex(int index) {
            if(index<0 || index>=size){
                return;
            }
            size--;
            ListNode curr=head;
            for(int i=0; i
                curr=curr.next;
            }
            curr.next=curr.next.next;
        }
    }
    复制代码

         首先我们自己定义一个ListNode节点,设计一个链表里面有两个属性,一个大小,一个节点,首先先初始化一个链表,并且有一个虚拟头结点。然后开始第一个获取功能,主要是要循环index+1次,因为包括了头结点,对于增加节点功能,得判断输入的情况,再循环index次,使用上面提到的增加节点方法即可(size要+1)。对于删除节点,同样也要循环index次,使用上面提到的方法删除即可(size要-1)。最后在头尾插入元素,调用实现的插入函数即可。

        这是一道基础题,不难,但是一定要掌握,否则基础没过关,后面题没法弄!!!

  • 相关阅读:
    【C语言】文件操作
    JMeter动态线程组和动态吞吐量
    Activiti 8.0.0 发布,业务流程管理与工作流系统
    Mysql入门原理,个人整理,不足之处,请多多指教
    BLE协议栈1-物理层PHY
    如何将github的项目部署到k8s?
    微擎模块 飞悦旅游小程序1.9.1完善后台平台信息,教育培训学校 1.4.3
    瑞吉外卖 —— 8、菜品展示、购物车、下单
    超赞极简奶油风装修攻略~速来抄作业
    简洁高效的微信小程序分页器封装实践
  • 原文地址:https://www.cnblogs.com/lzdream/p/16930232.html