这是一道较为复杂的链表的经典面试题,下面直接贴出代码,欢迎大家留言交流
"""
复杂链表的复制
思路:1.先循环一遍,把原链表的各个元素复制一遍连成串
2.再循环一遍,复制原链表的随机指针,在新链表中指向对应元素
3.最后循环一遍,把原链表和新链表解链
"""
# -*- 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
cur = pHead
while cur:
# 生成新的结点元素
node = RandomListNode(cur.label)
# 让新的结点元素指向原链表头结点的下一个结点
node.next = cur.next
# 将原链表的头结点指向新链表的头结点
cur.next = node
# 原链表头结点后移
cur = node.next
cur = pHead
while cur:
# 判断原链表的结点是否有随机结点
if cur.random:
# 原链表中结点的下一个结点即是新链表的结点
# 新链表的随机结点即是原链表中随机结点的下一个结点
cur.next.random = cur.random.next
# 原链表后移,中间隔着新链表结点,所以需要后移两步
cur = cur.next.next
cur = pHead
new_Head = pHead.next
new_cur = pHead.next
while cur:
# 将原链表的结点依次指向原链表的下一个结点
cur.next = cur.next.next
# 判断新链表是否有下一个结点
if new_cur.next:
# 将新链表的结点依次指向新链表的下一个结点
new_cur.next = new_cur.next.next
# 新链表后移
new_cur = new_cur.next
# 原链表后移
cur = cur.next
return new_Head