zoukankan      html  css  js  c++  java
  • 剑指offer 面试35题

    面试35题:

    题目:复杂链表的复制

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

    解题思路一:“Python作弊法”

    解题代码:

    # -*- 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
            import copy
            return copy.deepcopy(pHead)

    解题思路二:分解法。详见剑指offer P188

    解题代码:

    # -*- 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
            self.CloneNodes(pHead)
            self.ConnectRandomNodes(pHead)
            return self.ReconnectNodes(pHead)
        
        def CloneNodes(self,pHead):
            '''
            复制原始链表的每个结点, 将复制的结点链接在其原始结点的后面
            '''
            pNode=pHead
            while pNode:
                pCloned=RandomListNode(0)
                pCloned.label=pNode.label
                pCloned.next=pNode.next
    
                pNode.next=pCloned
                pNode=pCloned.next
        
        def ConnectRandomNodes(self,pHead):
            '''
            将复制后的链表中的克隆结点的random指针链接到被克隆结点random指针的后一个结点
            '''
            pNode=pHead
            while pNode:
                pCloned=pNode.next
                if pNode.random!=None:
                    pCloned.random=pNode.random.next
                pNode=pCloned.next
    
        def ReconnectNodes(self,pHead):
            '''
            拆分链表:将原始链表的结点组成新的链表, 复制结点组成复制后的链表
            '''
            pNode=pHead
            pClonedHead=pClonedNode=pNode.next
            pNode.next = pClonedNode.next
            pNode=pNode.next
            while pNode:
                pClonedNode.next=pNode.next
                pClonedNode=pClonedNode.next
                pNode.next=pClonedNode.next
                pNode=pNode.next
            return pClonedHead


    解法三:递归法,强烈推荐。

    # -*- 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
            newNode=RandomListNode(pHead.label)
            newNode.random=pHead.random
            newNode.next=self.Clone(pHead.next)
            return newNode
  • 相关阅读:
    MVC3.0 如何点击点击一张图片连接到另一地址
    什么是SMTP?
    ASP.NET MVC中 Jquery AJAX 获取数据利用MVC模型绑定实现输出
    MVC HTML控件扩展例子
    连接局域网内的mysql服务
    python loger 模板
    培养正确的编程态度和方法转
    Chrome不支持showModalDialog模态对话框和无法返回returnValue的问题
    SQL中时间与秒互转
    VS开发好用的扩展
  • 原文地址:https://www.cnblogs.com/yanmk/p/9220525.html
Copyright © 2011-2022 走看看