题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
题目地址
思路
思路1:
我们这里将复杂链表的复制过程分解为三个步骤。在写代码的时候我们每一步定义一个函数,这样每个函数完成一个功能,整个过程的逻辑也就非常清晰明了了。
我们这里采用三步:
- 第一步:复制复杂指针的label和next。但是这次我们把复制的结点跟在元结点后面,而不是直接创建新的链表;
- 第二步:设置复制出来的结点的random。因为新旧结点是前后对应关系,所以也是一步就能找到random;
- 第三步:拆分链表。奇数是原链表,偶数是复制的链表。
有图思路更清晰:
Python
# -*- coding:utf-8 -*- class RandomListNode: def __init__(self, x): self.label = x self.next = None self.random = None # 复杂链表 node1 = RandomListNode(1) node2 = RandomListNode(2) node3 = RandomListNode(3) node4 = RandomListNode(4) node1.next = node2 node2.next = node3 node3.next = node4 node1.random = node3 node2.random = node4 node3.random = node2 node4.random = node1 class Solution: def Clone(self, pHead): if not pHead: return pHead # 复制结点在原结点后面 pCur = pHead while pCur: node = RandomListNode(pCur.label) node.next = pCur.next pCur.next = node pCur = node.next # 复制random结点 pCur = pHead while pCur: if pCur.random: pCur.next.random = pCur.random.next pCur = pCur.next.next # 分离新旧结点 head = pHead.next cur = head pCur = pHead while pCur: pCur.next = pCur.next.next if cur.next: cur.next = cur.next.next cur = cur.next pCur = pCur.next return head if __name__ == '__main__': result = Solution().Clone(node1) while result: print(result.label, end = ' ') result = result.next
作者:huangqiancun
出处:http://www.cnblogs.com/huangqiancun/
本博客若无特殊说明则由作者原创发布,欢迎转载,但请注明出处 :)