Day25:复杂链表的复制
时间:2022-07-24
本文章向大家介绍Day25:复杂链表的复制,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
剑指Offer_编程题——复杂链表的复制
题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。 注意:输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空。
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体思路:
第一步:在原节点后面创建一个相同的节点,其实就是链表插入的过程。具体过程如下图:
第二步,遍历克隆的节点,让它的random等于原来的随机的next,也就是下一个节点
第三步,遍历整个克隆完毕的链表,让当前点指向下面隔一个的点
具体思路用Java实现如下:
public class Solution{
public RandomListNode Clone(RandomListNode pHead){
while (pHead == null){
return null;
}
RandomListNode cur = pHead;
while(cur != null){
RandomListNode clone1 = new RandomListNode(cur.label);
clone1.next = cur.next;
cur.next = clone1;
cur = clone1.next;
}
cur = pHead;
while(cur != null){
RandomListNode clone2 = cur.next;
if(cur.random != null) {
clone2.random = cur.random.next;
}
cur = clone2.next;
}
cur = pHead;
RandomListNode resultHead = cur.next;
while(cur.next != null){
RandomListNode clone3 = cur.next;
cur.next = clone3.next;
cur = clone3;
}
return resultHead;
}
}
代码通过示意图如图所示:
正如前面提到一样,牛客网已经为我们定义了节点,不需要我们重复定义,但是在自己的本地编译器中,我们需要定义节点RandomListNode的类,具体实现如下:
public class RandomListNode{
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label)
{
this.label = label;
}
}
用python实现该思路:
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
self.cloneNodes(pHead)
self.connectSiblingNodes(pHead)
return self.reconnectNodes(pHead)
def cloneNodes(self, pHead):
pNode = pHead
while pNode:
pCloned = RandomListNode(pNode.label)
pCloned.next = pNode.next
pNode.next = pCloned
pNode = pCloned.next
def connectSiblingNodes(self, pHead):
pNode = pHead
while pNode:
pclone = pNode.next
if pNode.random:
pclone.random = pNode.random.next
pNode = pclone.next
def reconnectNodes(self, pHead):
pNode = pHead
pCloneHead = None
pCloneNode = None
if pNode:
pCloneHead = pCloneNode = pNode.next
pNode.next = pCloneNode.next
pNode = pNode.next
while pNode:
pCloneNode.next, pCloneNode = pNode.next, pCloneNode.next
pNode.next, pNode = pCloneNode.next, pNode.next
return pCloneHead
代码效果图如图所示:
用python实现该链表结构:
class RandomListNode{
def __init__(self, x):
self.label = x
self.next = None
self.random = None
}
总结
本道题主要考察复杂链表的复制,本题主要用到的核心算法就是分而治之的思想。并且我们通过一个案例来让我们更加明白这个题的要求,并且分别用java和python将其实现,其实本题是通过一个给出一种新型链表的定义,让我们打印出其表头。这是将链表、分而治之以及我们分析问题的实际能力相结合。当然我们也要掌握数据结构相关的知识,只有这样,才能遇到综合性问题做到融会贯通,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!
参考文献
[1] IDEA_TEYU_1112 [2] 负雪明烛
- Java后端WebSocket的Tomcat实现
- jwplayer 隐藏属性方法记载
- TensorFlow从0到1丨开篇:Hello TensorFlow !
- JS原型继承和类式继承
- 在Servlet的init方法中创建线程
- TensorFlow从0到1丨第2篇:TensorFlow核心编程
- AngularJS中的按需加载ocLazyLoad
- AngularJS driective 封装 自动滚动插件
- java类过滤器,防止页面SQL注入
- Web项目添加Maven支持
- Jquery 获取第一个子元素
- Dropwizard框架入门
- Java 解析Excel文件为JSON
- SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微软自家沙盒 Sandbox公布
- php DES加密算法实例分析
- php提供实现反射的方法和实例代码
- PHP实现批量修改文件名的方法示例
- Linux VPS快速下载Bilibili视频脚本 ,支持1080P/720P/360P等格式
- PHP递归统计系统中代码行数
- PHP切割整数工具类似微信红包金额分配的思路详解
- php写入文件不覆盖的实例讲解
- php解决crontab定时任务不能写入文件问题的方法分析
- Laravel项目中timeAgo字段语言转换的改善方法示例
- php生成微信红包数组的方法
- 解决php写入数据库乱码的问题
- php写入txt乱码的解决方法
- PHP实现的AES 128位加密算法示例
- php写入mysql中文乱码的实例解决方法