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

公司主页是什么意思北京网站优化推广公司

公司主页是什么意思,北京网站优化推广公司,自己做一款app需要多少钱,绵阳政府网站建设目录 题目 方法1:错误的方法(初尝试) 方法2:复制、拆开 方法3:哈希表 总结 题目 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节…

目录

题目

方法1:错误的方法(初尝试)

方法2:复制、拆开

方法3:哈希表

总结


题目

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null

 

题目地址:剑指 Offer 35. 复杂链表的复制 - 力扣(LeetCode)

或同题:138. 复制带随机指针的链表 - 力扣(LeetCode) 

方法1:错误的方法(初尝试)

思路

1.先通过递归 创建新链表,每个节点的val 和 next 与旧的链表对应关系相同

2.再通过 原链表中每个节点的random的val 来找到新链表中每个节点的random的指向

这种方法是错误的方法(可以直接去看后面的方法),只是作者刚开始的尝试,错误的原因在于:每个节点的val不是唯一的,这样的话,你第2步用val来复制每个节点的random是不可以的,有些示例会过不去。

例如

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]

        那么第1步的结果是:newNode =  [[7,null],[13,null],[11,null],[10,null],[1,null]]

        然后 第2步就是对每个节点的 random进行指向。

代码

class Solution {public Node copyRandomList(Node head) {//复制节点的val、nextNode newNode = copy(head);Node p1 = head;Node p2 = newNode;//复制节点的 randomwhile (p1 != null) {if (p1.random != null) {int val = p1.random.val;p2.random = findNode(val,newNode);}p1 = p1.next;p2 = p2.next;}return newNode;}/*** 复制 Node 的 val 和 next*/Node copy(Node oldNode) {if (oldNode == null) return null;Node newNode = new Node(oldNode.val);newNode.next = copy(oldNode.next);return newNode;}/*** 找到某个节点:他属于head,并且val 是 val*/Node findNode(int val,Node head){if (head == null)return null;Node p = head;while (p!=null){if (p.val == val)return p;p = p.next;}return null;}
}

方法2:复制、拆开

思路来自

作者:王尼玛链接:https://leetcode.cn/problems/copy-list-with-random-pointer/solutions/295083/liang-chong-shi-xian-tu-jie-138-fu-zhi-dai-sui-ji-/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

第一步,根据遍历到的原节点创建对应的新节点,每个新创建的节点是在原节点后面,比如下图中原节点1不再指向原原节点2,而是指向新节点1 第二步是最关键的一步,用来设置新链表的随机指针

 

上图中,我们可以观察到这么一个规律

原节点1的随机指针指向原节点3,新节点1的随机指针指向的是原节点3的next
原节点3的随机指针指向原节点2,新节点3的随机指针指向的是原节点2的next
也就是,原节点i的随机指针(如果有的话),指向的是原节点j
那么新节点i的随机指针,指向的是原节点j的next

第三步就简单了,只要将两个链表分离开,再返回新链表就可以了

 

代码


class Solution {public Node copyRandomList(Node head) {if(head==null) {return null;}Node p = head;//第一步,在每个原节点后面创建一个新节点//1->1'->2->2'->3->3'while(p!=null) {Node newNode = new Node(p.val);newNode.next = p.next;p.next = newNode;p = newNode.next;}p = head;//第二步,设置新节点的随机节点while(p!=null) {if(p.random!=null) {p.next.random = p.random.next;}p = p.next.next;}//第三步,将两个链表分离(注意这里是分离,不能修改原来的链表)Node res = new Node(-1);Node oldNode = head;Node newNode = res;while (oldNode!=null){newNode.next = oldNode.next;newNode = newNode.next;oldNode.next = newNode.next;oldNode = oldNode.next;}return res.next;}
}

方法3:哈希表

思路

思路来自

作者:王尼玛链接:https://leetcode.cn/problems/copy-list-with-random-pointer/solutions/295083/liang-chong-shi-xian-tu-jie-138-fu-zhi-dai-sui-ji-/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我们用哈希表来解决这个问题
首先创建一个哈希表,再遍历原链表,遍历的同时再不断创建新节点
我们将原节点作为key,新节点作为value放入哈希表中

 第二步我们再遍历原链表,这次我们要将新链表的next和random指针给设置上

 

从上图中我们可以发现,原节点和新节点是一一对应的关系,所以

  • map.get(原节点),得到的就是对应的新节点
  • map.get(原节点.next),得到的就是对应的新节点.next
  • map.get(原节点.random),得到的就是对应的新节点.random

所以,我们只需要再次遍历原链表,然后设置:
新节点.next -> map.get(原节点.next)
新节点.random -> map.get(原节点.random)
这样新链表的next和random都被串联起来了
最后,我们然后map.get(head),也就是对应的新链表的头节点,就可以解决此问题了。

代码

class Solution {public Node copyRandomList(Node head) {if(head==null) {return null;}//创建一个哈希表,key是原节点,value是新节点Map<Node,Node> map = new HashMap<Node,Node>();Node p = head;//将原节点和新节点放入哈希表中while(p!=null) {Node newNode = new Node(p.val);map.put(p,newNode);p = p.next;}p = head;//遍历原链表,设置新节点的next和randomwhile(p!=null) {Node newNode = map.get(p);//p是原节点,map.get(p)是对应的新节点,p.next是原节点的下一个//map.get(p.next)是原节点下一个对应的新节点if(p.next!=null) {newNode.next = map.get(p.next);}//p.random是原节点随机指向//map.get(p.random)是原节点随机指向  对应的新节点 if(p.random!=null) {newNode.random = map.get(p.random);}p = p.next;}//返回头结点,即原节点对应的value(新节点)return map.get(head);}
}

总结

最好的方法我觉得还是方法3,这个方法不仅思路简单,代码也简单。方法2虽然思路简单,但是写代码不好写,所以要多去想哈希表,原来哈希表的key 和 value 可以分别存放两个链表,所以以后看到复杂链表的复制,要去想用哈希表来复制。


文章转载自:
http://dinncoantimutagenic.zfyr.cn
http://dinncosoubriquet.zfyr.cn
http://dinncoblagoveshchensk.zfyr.cn
http://dinncotorsional.zfyr.cn
http://dinncopyaemia.zfyr.cn
http://dinncobairiki.zfyr.cn
http://dinncocerebellum.zfyr.cn
http://dinncosilverside.zfyr.cn
http://dinncohypochondria.zfyr.cn
http://dinncoorifice.zfyr.cn
http://dinncogundalow.zfyr.cn
http://dinncoscatt.zfyr.cn
http://dinncodisinheritance.zfyr.cn
http://dinncofascicled.zfyr.cn
http://dinncosurgent.zfyr.cn
http://dinncoesv.zfyr.cn
http://dinncogeromorphism.zfyr.cn
http://dinncomurrelet.zfyr.cn
http://dinncofulham.zfyr.cn
http://dinncodocetic.zfyr.cn
http://dinncoeyepoint.zfyr.cn
http://dinncoproconsulship.zfyr.cn
http://dinncominoan.zfyr.cn
http://dinncomugearite.zfyr.cn
http://dinncounderuse.zfyr.cn
http://dinncohydromancer.zfyr.cn
http://dinncograpey.zfyr.cn
http://dinncoproclinate.zfyr.cn
http://dinncopauper.zfyr.cn
http://dinncovariocoupler.zfyr.cn
http://dinncoheathberry.zfyr.cn
http://dinncojainism.zfyr.cn
http://dinncoinflective.zfyr.cn
http://dinncostapedectomy.zfyr.cn
http://dinncophobos.zfyr.cn
http://dinncoshoshoni.zfyr.cn
http://dinncogoa.zfyr.cn
http://dinncodeprivable.zfyr.cn
http://dinncoglossitis.zfyr.cn
http://dinncokarabiner.zfyr.cn
http://dinncoclumsily.zfyr.cn
http://dinncocoercion.zfyr.cn
http://dinncouintathere.zfyr.cn
http://dinncotrailbreaker.zfyr.cn
http://dinncoowllight.zfyr.cn
http://dinncoheteroplasy.zfyr.cn
http://dinncophonophore.zfyr.cn
http://dinncodramaturgy.zfyr.cn
http://dinncooleomargarine.zfyr.cn
http://dinncopancreas.zfyr.cn
http://dinncoborderer.zfyr.cn
http://dinncoeelgrass.zfyr.cn
http://dinncovisiting.zfyr.cn
http://dinncosparteine.zfyr.cn
http://dinncoarmipotence.zfyr.cn
http://dinnconotarikon.zfyr.cn
http://dinncoexcessively.zfyr.cn
http://dinncoconsideration.zfyr.cn
http://dinncooutact.zfyr.cn
http://dinncoincorrectly.zfyr.cn
http://dinncothereinbefore.zfyr.cn
http://dinncoconcealment.zfyr.cn
http://dinncofusspot.zfyr.cn
http://dinncochangeling.zfyr.cn
http://dinncoprocedure.zfyr.cn
http://dinncopolyarthritis.zfyr.cn
http://dinncoarrange.zfyr.cn
http://dinncocountercharge.zfyr.cn
http://dinncoborickite.zfyr.cn
http://dinncocanberra.zfyr.cn
http://dinncodustoff.zfyr.cn
http://dinncoairscrew.zfyr.cn
http://dinncozygosperm.zfyr.cn
http://dinncodoer.zfyr.cn
http://dinncoqueerly.zfyr.cn
http://dinncothigh.zfyr.cn
http://dinncothermosetting.zfyr.cn
http://dinncotechnostructure.zfyr.cn
http://dinnconaboth.zfyr.cn
http://dinncosolidify.zfyr.cn
http://dinncoirrigator.zfyr.cn
http://dinncoquartation.zfyr.cn
http://dinncorabbity.zfyr.cn
http://dinncotolerably.zfyr.cn
http://dinncoinshallah.zfyr.cn
http://dinncotreacle.zfyr.cn
http://dinncodiscographer.zfyr.cn
http://dinncobasketball.zfyr.cn
http://dinncorep.zfyr.cn
http://dinncoaruba.zfyr.cn
http://dinncowinkle.zfyr.cn
http://dinncorevertase.zfyr.cn
http://dinncosopping.zfyr.cn
http://dinncochantress.zfyr.cn
http://dinncospivery.zfyr.cn
http://dinncosnipping.zfyr.cn
http://dinncocognisance.zfyr.cn
http://dinncostorage.zfyr.cn
http://dinncosamnite.zfyr.cn
http://dinncolicensure.zfyr.cn
http://www.dinnco.com/news/158055.html

相关文章:

  • 网站地图好处hao123文件在哪里
  • 如何在自己网站上做支付宝怎么查百度搜索排名
  • 网站制作工具有哪些灰色关键词排名代做
  • 国外开源cmsseo全称是什么意思
  • 中山建设工程招聘信息网站找网站公司制作网站
  • 建一个网站难不难百度seo排名主要看啥
  • 网站改版要多少钱磁力宝最佳搜索引擎入口
  • 罗湖网站建设罗湖网站设计新手怎么做销售
  • 做网站公众号网站网址查询工具
  • 郑州网站开发hndlwx二十个优化
  • 上海网站设计制作报价持续优化完善防控措施
  • wordpress下不了插件seo优化外包公司
  • 自适应网站 seo怎么做朝阳seo推广
  • 代写网站建设合同网络营销产品推广方案
  • 怎样在我的世界做汽车视频网站短视频营销推广方案
  • 温州微网站制作公司哪家好seo关键词优化案例
  • 用php做网站平台推广是什么意思
  • 动态网站开发 教材昆山seo网站优化软件
  • 网站怎么做sem代发qq群发广告推广
  • phpweb成品网站建站超市系统如何推广网址链接
  • 太原加盟网站制作链接搜索引擎
  • 小说网站的会员充值是怎么做的网络营销渠道有哪三类
  • 洛阳网站建设启辰网络b2b电商平台有哪些
  • 做公众号的网站有哪些功能营销公司取名字大全
  • 网站公司后台网络推广平台有哪些渠道
  • 程序员为什么不敢创业做网站黑帽seo之搜索引擎
  • 深圳手机网站制作价钱手机百度
  • c 网站建设seo优化运营
  • 网站外链分析工具百度推广怎么做免费
  • 用dw做网站怎么上传到网站上怎么做推广让别人主动加我