@剑指offer(python)复杂链表的复制

剑指offer刷题笔记25(python)

题目描述

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

思路1

链表和二叉树一样,前后节点都有关系,因此可以利用递归来做。

代码1

#     def __init__(self, x):
#         self.label = x
#         self.next = None
#         self.random = None
class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        # write code here
        if pHead == None:
            return None
        # 新建一个链表的头结点
        newhead = RandomListNode(pHead.label)    
        # 令头结点的random等于原来头节点的random
        newhead.random = pHead.random  
        # 令头结点的next等于原来头结点的next (这一步可以省略,直接让newhead.next等于递归后的pHead.next)         
        newhead.next = pHead.next
        # 递归处理newhead.next
        newhead.next = self.Clone(pHead.next)
        return newhead

思路2

不用递归的话,可以在之前链表的基础上挨个复制节点和它们之间的关系,最后江新旧链表剥离即可,可以通过下面三步来完成。
1.复制节点,并复制他们之间的next关系。这一步不用管新链表的random节点。
2.根据旧链表的random关系,建立新链表的random关系。
3.新旧链表剥离。

代码2

# -*- 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 pHead == None:
            return None
        # 第一步,复制链表
        cur = pHead
        while cur:
            curnext = cur.next
            tempNode = RandomListNode(cur.label)
            tempNode.next = curnext
            cur.next = tempNode
            cur = curnext
        # 第二步,复制random关系
        cur = pHead
        while cur:
            currandom = cur.random
            tempNode = cur.next
            if currandom:
                tempNode.random = currandom.next
            cur = tempNode.next
        # 第三步,分离新旧链表,新旧链表的唯一联系是next关系,把这个next关系剥离之后就可以了
        cur = pHead
        newhead = pHead.next # 返回新链表的头结点
        while cur:
            newnode = cur.next
            curnext = newnode.next
            if curnext:
                cur.next = curnext
                newnode.next = curnext.next
            else:
                cur.next = None
                newnode.next = None
            cur = curnext
        return newhead

你可能感兴趣的:(剑指offer(python))