题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

题目分析
1.如果链表为空链表,则返回本身即可
2.如果非空 需要进行复制操作,如果没有特殊指针,只需要复制next我相信大家都能很快做出来,但是加上特殊指针这就需要一定技巧,因为特殊指针随便指,而你每次找特殊指针所指的节点都需要从头开始遍历找起,这显然复杂度高达O(n²)
下面介绍一个巧妙地思想方法:
如图
首先第一步 复制原来的链表,顺次连接形成新链表

cloNode = pHead
while cloNode:
#完成第一步的核心操作
node = RandomListNode(cloNode.label)
node.next = cloNode.next
cloNode.next = node cloNode = node.next #下一次操作

第二步,利用原节点的random指向,来用复制的相应节点的random

cloNode = pHead
while cloNode:
node = cloNode.next #指向复制的结点
if cloNode.random: #如果原节点有特殊指针
node.random = cloNode.random.next #则复制的节点的特殊指针指向原节点的特殊指针指向的下一个值 看图更好理解一些
cloNode = node.next

最后一步,将复制好的链表拆分出来,或者说将 偶数位的节点重新拆分合成新的链表,得到的就是复制的链表

cloNode = pHead
pHead = pHead.next
while cloNode.next:
#完成第三步的核心操作 此时节点指向隔了一个节点的节点
node = cloNode.next
cloNode.next = node.next cloNode = node #下一个节点的操作

这个操作其实就是将两个链表顺次全都拆分出来,一个很关键的步骤 pHead = pHead.next 如果没有这句话,最后得到的pHead就是原链表的开头了。

总程序如下:

# -*- coding:utf-8 -*-
# class RandomListNode:
# def __init__(self, x):
# self.label = x
# self.next = None
# self.random = None
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
if not pHead:
return pHead
cloNode = pHead
while cloNode:
node = RandomListNode(cloNode.label)
node.next = cloNode.next
cloNode.next = node
cloNode = node.next
cloNode = pHead
while cloNode:
node = cloNode.next
if cloNode.random:
node.random = cloNode.random.next
cloNode = node.next
cloNode = pHead
pHead = pHead.next
while cloNode.next:
node = cloNode.next
cloNode.next = node.next
cloNode = node
return pHead

最新文章

  1. Oracle导入导出
  2. 树莓派上Java程序作为linux服务并开机自动启动
  3. OS X 下iso刻录U盘
  4. CentOS 配置 iptables 配合 ss
  5. SpringMVC + Spring + MyBatis 学习笔记:SpringMVC和Spring一同工作的时候,AOP事务管理不起作用的解决方法
  6. Maven安装与全局profile配置
  7. Sql Server数据库基础
  8. judge loop in undirected graph
  9. O2O网站
  10. js定时刷新页面.
  11. Struts 1 之<html>标签库
  12. slice是什么时候决定要扩张?
  13. Redis深入学习笔记(二)client list 命令详解
  14. RedHat下安装MySQL5.5
  15. Hbase记录-HBase扫描/计数/权限
  16. grpc 使用流程、使用技巧
  17. Delphi INI文件保存与读取
  18. Stealth潜行风格游戏源码(Unity5x)
  19. 第75讲:模式匹配下的For循环
  20. android app性能优化大汇总(google官方Android性能优化典范 - 第3季)

热门文章

  1. grep常用选项记录
  2. 【ACM】N皇后问题
  3. Java日志组件2---Log4j(org.apache.log4j.Logger)
  4. windows 7 下安装VMWARE 和 red-hat 7 64bit
  5. c++ 封装线程库 3
  6. Windows常用IDE下载(含安装教程)
  7. cannot focus element解决方案
  8. JDK、JRE、JVM各自是什么、以及什么关系
  9. nodejs的异步非阻塞IO
  10. [转]jquery 鼠标放在图片上显示图片的放大镜效果jqzoom_ev-2.3