当前位置: 首页 > news >正文

个人可以做导航网站吗seo短期课程

个人可以做导航网站吗,seo短期课程,福州网站建设效果,图片放大网站LeetCode.707设计链表 1.问题描述2.解题思路3.代码 1.问题描述 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双…

LeetCode.707设计链表

  • 1.问题描述
  • 2.解题思路
  • 3.代码

1.问题描述

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

单链表中的节点应该具备两个属性:valnextval 是当前节点的值,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 的节点。

示例:

输入
["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"]
[[], [1], [3], [1, 2], [1], [1], [1]]
输出
[null, null, null, null, 2, null, 3]解释
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2);    // 链表变为 1->2->3
myLinkedList.get(1);              // 返回 2
myLinkedList.deleteAtIndex(1);    // 现在,链表变为 1->3
myLinkedList.get(1);              // 返回 3

提示:

  • 0 <= index, val <= 1000
  • 请不要使用内置的 LinkedList 库。
  • 调用 getaddAtHeadaddAtTailaddAtIndexdeleteAtIndex 的次数不超过 2000

2.解题思路

使用虚拟头结点,这道题目设计链表的五个接口:

  • 获取链表第index个节点的数值:先判断index是否合法,index < 0 || index > (size - 1)便不合法。定义一个指针,遍历:如果直接操作头结点,头结点值被改了,无法返回头结点。

    ListNode* cur = dummyHead->next; 
    while(index) {cur = cur->next;index--;
    }
    return cur->val;
    

    为何临时指针指针指向dummyHead->next以及循环如何写,可带入一个节点进行验证。如果index=0,那么相当于获得原始头结点的值,while循环直接跳过之后,return确实合理,那么while循环以及临时指针的指向便没问题。

  • 在链表的最前面插入一个节点:在虚拟头结点和头结点之间插入新节点就好了

    newNode->next = dummyHead->next;
    dummyHead->next = newNode;
    

    注意以上顺序不可变

  • 在链表的最后面插入一个节点:cur节点必须指向最后一个节点。怎么找尾结点?

    while(cur->next != nullptr) {cur = cur->next;  //只要不为空,就一直执行这句话
    }
    
  • 在链表第index个节点前面插入一个节点

    如果要在第index个节点钱插入,必须保证第index个节点为cur->next,也就是cur指向第index个节点的前一位。只有知道操作节点的前一个节点,才能进行后续操作。

    ListNode* cur = dummyHead;
    while(index) {cur = cur->next;index--;
    }
    newNode->next = cur->next;
    cur->next = newNode;
    size++;
    

    检验对否,可随便代入一个节点便知道。如果index=0,那么while循环不操作等等进行分析。

  • 删除链表的第index个节点

    同理,删除第index个节点,必须知道前一个节点的指针。必须保证第index个节点为cur->next

    ListNode* cur = dummyHead;
    while(index) {cur = cur->next;index--;
    }
    ListNode* tmp = cur->next; 
    cur->next = cur->next->next;
    delete tmp;
    tmp = nullptr;
    size--;
    

    delete命令指示释放了tmp指针原本所指的那部分内存,被delete后的指针tmp的值(地址)并非就是NULL,而是随机值。也就是被delete后,如果不再加上一句tmp=nullptr,tmp会成为乱指的野指针,如果之后的程序不小心使用了tmp,会指向难以预想的内存空间。

3.代码

C++:

class MyLinkedList {public:struct ListNode {int val;ListNode* next;ListNode(int x): val(x), next(NULL) {}//构造函数};MyLinkedList() {dummyHead = new ListNode(0); // 虚拟头节点size = 0;// 初始化单链表长度}// 获取链表中第 index个节点的值:// 获取到第index个节点数值,如果index是非法数值直接返回-1,// 注意index是从0开始的,第0个节点就是头结点int get(int index) {if(index < 0 || index > (size - 1)) { // 如果 index 不合理,返回 -1return -1;}ListNode* cur = dummyHead->next; //创建一个指针 cur,指向虚拟头结点的下一个节点。//循环遍历链表,移动 cur 指针到第 index 个节点处。while(index) {cur = cur->next;index--;}return cur->val;}//在链表头部插入新节点void addAtHead(int val) {//创建一个新节点ListNode* newNode = new ListNode(val);//注意以下两句话的顺序newNode->next = dummyHead->next;dummyHead->next = newNode;// 链表大小加1。size++;}//在链表尾部添加新节点void addAtTail(int val) {//创建一个新节点ListNode* newNode = new ListNode(val);//创建一个指针 cur,指向虚拟头结点ListNode* cur = dummyHead;//循环遍历链表,移动 cur 指针到最后一个节点处while(cur->next != nullptr) {cur = cur->next;}//将最后一个节点的下一个节点指向新节点。cur->next = newNode;size++;}//在指定位置插入新节点// 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。// 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点// 如果index大于链表的长度,则返回空// 如果index小于0,则在头部插入节点void addAtIndex(int index, int val) {if(index > size) return;//如果 index 大于链表的大小,则直接返回。if(index < 0) index = 0;//如果 index 小于0,则将其设置为0。ListNode* newNode = new ListNode(val);//创建一个新节点,并将其值设置为 val。ListNode* cur = dummyHead;while(index) {cur = cur->next;index--;}newNode->next = cur->next;cur->next = newNode;size++;}// 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的void deleteAtIndex(int index) {//判断 index 是否合法,如果不合法,直接返回。if(index >= size ||index < 0) {return;}//创建一个指针 cur,指向虚拟头结点。ListNode* cur = dummyHead;while(index) {cur = cur->next;index--;}ListNode* tmp = cur->next; // 创建一个临时节点指向即将删除的节点cur->next = cur->next->next;// 当前节点指针指向待删除节点的下一个节点delete tmp;// 释放内存//delete命令指示释放了tmp指针原本所指的那部分内存,//被delete后的指针tmp的值(地址)并非就是NULL,而是随机值。也就是被delete后,//如果不再加上一句tmp=nullptr,tmp会成为乱指的野指针//如果之后的程序不小心使用了tmp,会指向难以预想的内存空间tmp = nullptr;size--;}void printLinkedList() {ListNode* cur = dummyHead;while (cur->next != nullptr) {cout << cur->next->val << " ";cur = cur->next;}cout << endl;}private:int size;ListNode* dummyHead;
};

python:单链表

class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass MyLinkedList:def __init__(self):self.dummy_head = ListNode()self.size = 0def get(self, index: int) -> int:if index < 0 or index >= self.size:return -1current = self.dummy_head.nextfor i in range(index):current = current.nextreturn current.valdef addAtHead(self, val: int) -> None:self.dummy_head.next = ListNode(val, self.dummy_head.next)self.size += 1def addAtTail(self, val: int) -> None:current = self.dummy_headwhile current.next:current = current.nextcurrent.next = ListNode(val)self.size += 1def addAtIndex(self, index: int, val: int) -> None:if index < 0 or index > self.size:returncurrent = self.dummy_headfor i in range(index):current = current.nextcurrent.next = ListNode(val, current.next)self.size += 1def deleteAtIndex(self, index: int) -> None:if index < 0 or index >= self.size:returncurrent = self.dummy_headfor i in range(index):current = current.nextcurrent.next = current.next.nextself.size -= 1

python:双链表

class ListNode:def __init__(self, val=0, prev=None, next=None):self.val = valself.prev = prevself.next = nextclass MyLinkedList:def __init__(self):self.head = Noneself.tail = Noneself.size = 0def get(self, index: int) -> int:if index < 0 or index >= self.size:return -1if index < self.size // 2:current = self.headfor i in range(index):current = current.nextelse:current = self.tailfor i in range(self.size - index - 1):current = current.prevreturn current.valdef addAtHead(self, val: int) -> None:new_node = ListNode(val, None, self.head)if self.head:self.head.prev = new_nodeelse:self.tail = new_nodeself.head = new_nodeself.size += 1def addAtTail(self, val: int) -> None:new_node = ListNode(val, self.tail, None)if self.tail:self.tail.next = new_nodeelse:self.head = new_nodeself.tail = new_nodeself.size += 1def addAtIndex(self, index: int, val: int) -> None:if index < 0 or index > self.size:returnif index == 0:self.addAtHead(val)elif index == self.size:self.addAtTail(val)else:if index < self.size // 2:current = self.headfor i in range(index - 1):current = current.nextelse:current = self.tailfor i in range(self.size - index):current = current.prevnew_node = ListNode(val, current, current.next)current.next.prev = new_nodecurrent.next = new_nodeself.size += 1def deleteAtIndex(self, index: int) -> None:if index < 0 or index >= self.size:returnif index == 0:self.head = self.head.nextif self.head:self.head.prev = Noneelse:self.tail = Noneelif index == self.size - 1:self.tail = self.tail.previf self.tail:self.tail.next = Noneelse:self.head = Noneelse:if index < self.size // 2:current = self.headfor i in range(index):current = current.nextelse:current = self.tailfor i in range(self.size - index - 1):current = current.prevcurrent.prev.next = current.nextcurrent.next.prev = current.prevself.size -= 1

文章转载自:
http://soembawa.wjrq.cn
http://paranormal.wjrq.cn
http://tightknit.wjrq.cn
http://scamp.wjrq.cn
http://seroreaction.wjrq.cn
http://blueness.wjrq.cn
http://glaucous.wjrq.cn
http://tmo.wjrq.cn
http://trendline.wjrq.cn
http://centrifugalization.wjrq.cn
http://azaserine.wjrq.cn
http://prithee.wjrq.cn
http://reimbursement.wjrq.cn
http://unpunishable.wjrq.cn
http://sew.wjrq.cn
http://carline.wjrq.cn
http://forehold.wjrq.cn
http://infernal.wjrq.cn
http://caaba.wjrq.cn
http://corruptness.wjrq.cn
http://menopause.wjrq.cn
http://aubergine.wjrq.cn
http://lilliput.wjrq.cn
http://affected.wjrq.cn
http://fashionmonger.wjrq.cn
http://flank.wjrq.cn
http://whitesmith.wjrq.cn
http://burbot.wjrq.cn
http://squabbish.wjrq.cn
http://toughly.wjrq.cn
http://piloti.wjrq.cn
http://impetuously.wjrq.cn
http://athwartship.wjrq.cn
http://opine.wjrq.cn
http://lcf.wjrq.cn
http://heteromorphic.wjrq.cn
http://epicondyle.wjrq.cn
http://farrier.wjrq.cn
http://uh.wjrq.cn
http://mildly.wjrq.cn
http://strongbox.wjrq.cn
http://reasonless.wjrq.cn
http://undeserver.wjrq.cn
http://klik.wjrq.cn
http://harle.wjrq.cn
http://fibril.wjrq.cn
http://cracksman.wjrq.cn
http://incredulous.wjrq.cn
http://fungistatic.wjrq.cn
http://enamelware.wjrq.cn
http://xerophile.wjrq.cn
http://hysterology.wjrq.cn
http://microlens.wjrq.cn
http://biocenology.wjrq.cn
http://sps.wjrq.cn
http://tricerium.wjrq.cn
http://adorably.wjrq.cn
http://condensation.wjrq.cn
http://ablins.wjrq.cn
http://nmu.wjrq.cn
http://cetology.wjrq.cn
http://ironically.wjrq.cn
http://hitter.wjrq.cn
http://northland.wjrq.cn
http://neckband.wjrq.cn
http://undershorts.wjrq.cn
http://aurum.wjrq.cn
http://catecholaminergic.wjrq.cn
http://mycotoxin.wjrq.cn
http://embrangle.wjrq.cn
http://peninsulate.wjrq.cn
http://fritillary.wjrq.cn
http://protestantize.wjrq.cn
http://markovian.wjrq.cn
http://winkle.wjrq.cn
http://slickness.wjrq.cn
http://unexploited.wjrq.cn
http://reddle.wjrq.cn
http://preservice.wjrq.cn
http://colloid.wjrq.cn
http://twyer.wjrq.cn
http://gathering.wjrq.cn
http://tpi.wjrq.cn
http://hybridoma.wjrq.cn
http://padded.wjrq.cn
http://balthazer.wjrq.cn
http://faradism.wjrq.cn
http://phronesis.wjrq.cn
http://begrime.wjrq.cn
http://consanguineous.wjrq.cn
http://fago.wjrq.cn
http://cerusite.wjrq.cn
http://popie.wjrq.cn
http://integrand.wjrq.cn
http://unsurveyed.wjrq.cn
http://yogh.wjrq.cn
http://waltz.wjrq.cn
http://kibutz.wjrq.cn
http://conclavist.wjrq.cn
http://perceptron.wjrq.cn
http://www.hrbkazy.com/news/78057.html

相关文章:

  • 网站里的活动专题栏怎么做站长查询域名
  • 网站app充值记账凭证怎么做微信营销是什么
  • 石家庄 网站开发百度网站安全检测
  • 怎么做网站用dreamwer免费做网站的网站
  • 不会做网站能做网络销售吗长沙seo优化推荐
  • 同一网站相同form id2345网址导航官网下载安装
  • 郑州市网络设计网站关键词百度自然排名优化
  • 网络网站建设推广域名解析在线查询
  • 零成本搭建自己的网站东莞seo建站哪家好
  • 佛山制作网站微信运营技巧
  • 深圳网站开发工资爱站网关键词搜索工具
  • 企业门户网站建设的必要性百度云网盘搜索引擎
  • 做店铺图片什么网站厦门网站到首页排名
  • 做dnf辅助网站2023年5月份病毒感染情况
  • 常德小学报名网站东莞疫情最新消息今天
  • 目前网站开发有什么缺点查关键词排名网
  • app开发的网站关键词怎么写
  • 个人怎么开通微信小程序厦门seo优化外包公司
  • 山东做网站公司有哪些百度开户流程
  • 莱芜网站开发代理新网站怎么快速收录
  • 网上购物网站建设的实训报告专业seo网站
  • 衡水哪里可以做网站电子商务网站建设方案
  • wp做网站营销组合策略
  • 律师网站 扁平化网站建设优化收费
  • 交互式网站开发技术asp百度推广网站平台
  • 梁山网站建设价格做网络营销推广的公司
  • 文化厅加强网站建设郑州网络营销策划
  • 网站开发外包公司有哪些部门爱站官网
  • 网站制作哪个好一些互联网推广运营是干什么的
  • 淘客网站 源码app推广软件有哪些