您的位置:首页 > Web前端

剑指offer 复杂链表复制

2018-03-21 18:00 555 查看

题目描述

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

解题思路:

1、复制每个节点,如:复制节点A得到A1,将A1插入节点A后面

2、遍历链表,A1->random = A->random->next;

3、将链表拆分成原链表和复制后的链表

注意:在拆分的时候必须同时拆分,不能想着先拆分原始链表再拆分复制链表,必须同时拆分,因为如果打算先拆分一个链表拆分完后链表已经不再包含另一个链表的节点了(是一个思维的小误区,一开始没反应过来)。

答案:

自己的代码写的太丑了,粘了的别人的代码。

链接:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba
来源:牛客网

# -*- 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):
if not pHead:
return None

dummy = pHead

# first step, N' to N next
while dummy:
dummynext = dummy.next
copynode = RandomListNode(dummy.label)
copynode.next = dummynext
dummy.next = copynode
dummy = dummynext

dummy = pHead

# second step, random' to random'
while dummy:
dummyrandom = dummy.random
copynode = dummy.next
if dummyrandom:#这里是因为随机节点可能为空,一开始没有考虑到。
copynode.random = dummyrandom.next
dummy = copynode.next

# third step, 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: