复杂链表的复制
时间限制:1秒 空间限制:32768K 热度指数:329252
本题知识点: 链表
算法知识视频讲解
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
法1.哈希表法
# -*- 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
nodeList = []
randomList = []
resList = []
while pHead:
randomList.append(pHead.random)
nodeList.append(pHead)
resList.append(RandomListNode(pHead.label))
pHead = pHead.next
RandomIndex = [nodeList.index(i) if i != None else None for i in randomList]
ans = res = RandomListNode(0)
for i in range(len(resList)):
res.next = resList[i]
res.next.random = resList[RandomIndex[i]] if RandomIndex[i] != None else None
res = res.next
return ans.next
法2.三步法
解析
图4.8 是一个含有5 个结点的复杂链表。图中实线箭头表示next 指针,虚线箭头表示随机引用。为简单起见,指向null 的指针没有画出。
-
把复制的结点链接在原始链表的每一对应结点后面
-
把复制的结点的random指针指向被复制结点的random指针的下一个结点
-
拆分成两个链表,奇数位置为原链表,偶数位置为复制链表,注意复制链表的最后一个结点的next指针不能跟原链表指向同一个空结点None,next指针要重新赋值None(判定程序会认定你没有完成复制)
代码
# 法3.三步法
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
if not pHead:
return None
# 1.copy phead
dummy = pHead
while dummy:
dummyNext = dummy.next
copyNode = RandomListNode(dummy.label)
copyNode.next = dummyNext
dummy.next = copyNode
dummy = dummyNext
# 2.random to random
dummy = pHead
while dummy:
dummyRandom = dummy.random
copyNode = dummy.next
if dummyRandom:
copyNode.random = dummyRandom.next
dummy = copyNode.next
# 3.split linked list
dummy = pHead
copyHead = pHead.next
while dummy:
copyNode = dummy.next
dummyNext = copyNode.next
dummy.next = dummyNext
if dummyNext:
copyNode.next = dummyNext.next
else:
copyNode.next = None
dummy = dummyNext
return copyHead
链接:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba
来源:牛客网