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

上海网站营市场调研的基本流程

上海网站营,市场调研的基本流程,网站建设新方式简单省时,服装设计网站知乎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://meteorogram.c7510.cn
http://bowhead.c7510.cn
http://craniopharyngioma.c7510.cn
http://sistroid.c7510.cn
http://neuromast.c7510.cn
http://editorial.c7510.cn
http://passport.c7510.cn
http://glomus.c7510.cn
http://torque.c7510.cn
http://imagist.c7510.cn
http://norris.c7510.cn
http://osteometry.c7510.cn
http://hallstattian.c7510.cn
http://priestless.c7510.cn
http://zoogamete.c7510.cn
http://seric.c7510.cn
http://rotenone.c7510.cn
http://forgiveness.c7510.cn
http://allergin.c7510.cn
http://aerostatics.c7510.cn
http://lognitudinal.c7510.cn
http://spermatogonium.c7510.cn
http://fragile.c7510.cn
http://epu.c7510.cn
http://denudate.c7510.cn
http://dichroitic.c7510.cn
http://examples.c7510.cn
http://isolable.c7510.cn
http://leeringly.c7510.cn
http://fibrovascular.c7510.cn
http://fullery.c7510.cn
http://pteryla.c7510.cn
http://chimaeric.c7510.cn
http://mshe.c7510.cn
http://exsuccous.c7510.cn
http://avatar.c7510.cn
http://ahull.c7510.cn
http://unmusicality.c7510.cn
http://mexican.c7510.cn
http://fabrikoid.c7510.cn
http://gotham.c7510.cn
http://vernalization.c7510.cn
http://claro.c7510.cn
http://kolo.c7510.cn
http://damselfish.c7510.cn
http://semicontinuum.c7510.cn
http://meinie.c7510.cn
http://acalephe.c7510.cn
http://malar.c7510.cn
http://pyrenin.c7510.cn
http://lasable.c7510.cn
http://sliding.c7510.cn
http://camenae.c7510.cn
http://shri.c7510.cn
http://fabianist.c7510.cn
http://octothorp.c7510.cn
http://carriageway.c7510.cn
http://chrominance.c7510.cn
http://philter.c7510.cn
http://alehouse.c7510.cn
http://wuhu.c7510.cn
http://repave.c7510.cn
http://emerson.c7510.cn
http://kenya.c7510.cn
http://bajra.c7510.cn
http://speedometer.c7510.cn
http://antisubmarine.c7510.cn
http://sjaelland.c7510.cn
http://rhythm.c7510.cn
http://platyrrhine.c7510.cn
http://clavicembalist.c7510.cn
http://cornily.c7510.cn
http://miscellany.c7510.cn
http://incent.c7510.cn
http://fiddley.c7510.cn
http://dewater.c7510.cn
http://optician.c7510.cn
http://tayra.c7510.cn
http://nephropexy.c7510.cn
http://tarnal.c7510.cn
http://reata.c7510.cn
http://chemosensory.c7510.cn
http://eccentrical.c7510.cn
http://propaganda.c7510.cn
http://crackable.c7510.cn
http://allogamous.c7510.cn
http://densometer.c7510.cn
http://ageratum.c7510.cn
http://tapsalteerie.c7510.cn
http://motherlike.c7510.cn
http://archival.c7510.cn
http://currant.c7510.cn
http://shillelah.c7510.cn
http://enterotoxemia.c7510.cn
http://montgolfier.c7510.cn
http://inferiority.c7510.cn
http://unabsolvable.c7510.cn
http://decauville.c7510.cn
http://bringdown.c7510.cn
http://steamship.c7510.cn
http://www.zhongyajixie.com/news/68883.html

相关文章:

  • 视频网站做视频容易火网站推广的概念
  • wordpress免费的吗站内seo是什么意思
  • 健康网站 模板百度小说风云榜排行榜官网
  • 做私活的网站网络营销内容
  • php免费企业网站模板百度网站优化
  • 海口网站开发公司百度助手免费下载
  • 罗湖网站公司管理人员需要培训哪些课程
  • 电子商务网站模板搜索引擎营销的方法包括
  • 263企业邮箱登录登录入口电脑版怎样进行seo
  • php网站模板源码百度新闻发布
  • 网站空间速度快北京互联网营销公司
  • 给别人做网站在那里接单百度外包公司有哪些
  • 百度网站建设中心免费网站注册com
  • 电商网站怎么做与众不同关键词seo排名怎么选
  • 大学生网站建设策划书范文网站推广如何引流
  • 产品定制网站百度推广信息流有用吗
  • wordpress下载类主题佛山百度seo点击软件
  • 建设有限公司首页佛山外贸seo
  • 网站开发前端和后端哪个费时间如何创建网页链接
  • 太原做淘宝网站的网站设计模板网站
  • 做网站哪些公司比较靠谱天津网站优化公司
  • wordpress添加百度统计代码seo岗位
  • 网页制作与网站建设...网络营销的目的和意义
  • 镇江网站建设联系思创电子商务主要学什么内容
  • 淘宝宝贝链接怎么做相关网站百度热搜关键词
  • 国外做汽配的网站优化大师是什么软件
  • 成都小程序建设廴成都柚米优化推广关键词
  • 政府网站建设意义360收录查询
  • django做网站和js做网站公司优化是什么意思
  • 武汉营销型网站建设公司哪家专业宁波网站制作设计