首页 > 其他分享 >力扣707 设计链表

力扣707 设计链表

时间:2022-11-11 23:45:12浏览次数:52  
标签:力扣 ListNode val index 707 链表 节点 size

题目:

设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性: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 个节点。

 

代码:

//单链表
class ListNode{
    int val;
    ListNode next;
    ListNode(){}
    ListNode(int val){
        this.val=val;
    }
}

class MyLinkedList {
    int size;//存储链表元素的个数
    ListNode head;//虚拟头结点

    //初始化链表
    public MyLinkedList() {
        size = 0;//任何对链表操作的时候,都会让size属性变化,size++或者size--,所以size可以直接表示链表长度
        head = new ListNode(0);//创建值为0的空节点
    }
    
    //获取第index个节点的数值
    public int get(int index) {
        //判断index是否合法
        if (index<0||index>=size) {
            return -1;
        }
        ListNode cur=head;
        for(int i=0;i<=index;i++){
            cur=cur.next;
        }
        return cur.val;
    }
    
    //头插法
    public void addAtHead(int val) {
        ListNode insert = new ListNode(val);
     //链表为空 if (size==0) { head.next=insert;//直接放在头结点后 }else{ insert.next=head.next; head.next=insert; }
     size++; } //尾插法 public void addAtTail(int val) { ListNode insert = new ListNode(val);
     //链表为空 if (size==0) { head.next=insert;//直接放在头结点后 }else{ ListNode cur=head; for(int i=0;i<=size-1;i++){//i=0并不代表从head开始,控制循环次数 cur=cur.next; } cur.next=insert;//cur.next如果为NULL报错 } size++; } //在链表最前面插入一个节点 /*public void addAtHead(int val) { addAtIndex(0, val); }*/ //在链表的最后插入一个节点 /*public void addAtTail(int val) { addAtIndex(size, val); }*/ //在第index个节点前插入 public void addAtIndex(int index, int val) { //index不合法 if (index > size) { return; } if (index < 0) { index = 0; } size++;//增加一个节点 ListNode cur=head; ListNode insert = new ListNode(val); for(int i=0;i<=index-1;i++){ cur=cur.next; } insert.next=cur.next; cur.next=insert; } //删除第index个节点 public void deleteAtIndex(int index) { //判断index不合法 if (index < 0||index >= size) { return; } size--;//减少一个节点 if (index == 0) { head = head.next; return; } ListNode cur=head; for(int i=0;i<=index-1;i++){ cur=cur.next; } cur.next=cur.next.next; } }

 

标签:力扣,ListNode,val,index,707,链表,节点,size
From: https://www.cnblogs.com/cjhtxdy/p/16882443.html

相关文章

  • php实现单链表
    今天记录下使用php实现单向链表的功能操作先创建一个节点类用来生成节点对象<?phpclassnode{public$name=null;public$no=null;public$next=......
  • Hive函数重要应用案例(窗口函数、拉链表)
    五、窗口函数应用实例5.1连续登陆用户需求当前有一份用户登录数据如下图所示,数据中有两个字段,分别是userId和loginTime。userId表示唯一的用户ID,唯一标识一个用户,log......
  • 力扣-647-回文子串
    因为单字符也算是回文,所以至少有n个然后感觉又是二维dp感觉很像回溯解决排列组合问题感觉难点在于还要判断是不是回文,虽然可以借助栈,但是每次都压栈弹栈肯定复杂度太大......
  • list容器-链表
    3.7list容器3.7.1list基本概念功能:将数据进行链式存储(链表)链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的链表的组......
  • 力扣-122-买卖股票的最佳时机Ⅱ
    你也可以先购买,然后在同一天出售这句有什么意义?逻辑上说跟不买没区别,但是可能跟算法实现有关系感觉很明显是动态规划,二维的吗?单笔交易我们是这么做的:维护一个最低......
  • 力扣-309-最佳买卖股票时机含冷冻期
    查了下,类型题大概有6道题目描述:可以多次买卖,但是每次只能执行一笔买卖卖出后的第二天无法操作(买入)求最大获利买卖股票的原题是一次买入卖出,所以关键是找到最便宜的......
  • 数据结构篇——链表
    数据结构篇——链表本次我们介绍基础算法中的区间合并,我们会从下面几个角度来介绍:单链表双链表单链表我们会在这里介绍单链表单链表简介我们首先来简单介绍一下单......
  • 力扣 81. 搜索旋转排序数组 II
    81.搜索旋转排序数组II已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0<=k<nums.leng......
  • 循环双向链表实现
    双向链表实现链表结点定义双向链表节点定义由一个数据域和两个指针域组成。template<typenameT>classList_Node{public: typedefList_Node<T>*link_node;publi......
  • 力扣203 移除链表元素
    题目:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例:输入:head=[1,2,6,3,4,5,6],val=6输......