zoukankan      html  css  js  c++  java
  • 剑指offer-第四章解决面试题思路(复杂链表的复制)

    题目:请写一个函数clone(ComplexListNode pHead),实现复杂链表的复制。

    复杂链表的数据结构如下:public class ComplexListNode{int m_nValue;ComplexListNode m_pNext;ComplexListNode m_pSliping//指向链表中的任何一个节点}

    例如:m_pSliping指向NUll的,并没有画出来。

    将复杂的问题简单化,各个击破:

    思路:第一步,就是复制节点,并连接到原始节点的后面,第二步,设置复制出来节点的m_pSliping.第三步,将复制的链表从原始链表中分离。

    如图:

    Java代码:

    public class ComplexLinkCloned {
        //对于复杂链表的复制问题:1、复制节点,并连接到原始节点的后面。2.设置复制出来节点的m_pSliping。
        //3.将复制的链表从原始的链表中分离出来。
        public class ComplexListNode{
            int m_nValue;
            ComplexListNode m_pNext;
            ComplexListNode m_pSliping;
        }
        //复制节点
        public void clonedNode(ComplexListNode pHead){
            if(pHead==null)
                return;
            ComplexListNode pNode=pHead;
            while(pNode!=null){
                ComplexListNode pClonedNode=new ComplexListNode();
                pClonedNode.m_nValue=pNode.m_nValue;
                pClonedNode.m_pNext=pNode.m_pNext;
                pClonedNode.m_pSliping=null;
                pNode.m_pNext=pClonedNode;
                pNode=pClonedNode.m_pNext;
            }
        }
        //设置m_pSliping
        public void connectSlipingNode(ComplexListNode pHead){
            if(pHead==null)
                return;
            ComplexListNode pNode=pHead;
            while(pNode!=null){
                ComplexListNode pCloned=pNode.m_pNext;
                if(pNode.m_pSliping!=null){
                    pCloned.m_pSliping=pNode.m_pSliping.m_pNext;
                }
                pNode=pCloned.m_pNext;
            }
            
        }
         //将复制的链表从整个链表中分离
        public ComplexListNode reConnectNode(ComplexListNode pHead){
            ComplexListNode pNode=pHead;
            ComplexListNode pClonedNode=null;
            ComplexListNode pClonedHead=null;
            if(pNode!=null){
                pClonedHead=pClonedNode=pNode.m_pNext;
                pNode.m_pNext=pClonedNode.m_pNext;
                pNode=pNode.m_pNext;
            }
            while(pNode!=null){
                pClonedNode.m_pNext=pNode.m_pNext;
                pClonedNode=pClonedNode.m_pNext;
                pNode.m_pNext=pClonedNode.m_pNext;
                pNode=pNode.m_pNext;
                
            }
            return pClonedHead;
        }
        public ComplexListNode Clone(ComplexListNode pHead){
            clonedNode(pHead);
            connectSlipingNode(pHead);
            return reConnectNode(pHead);
        }
       
    }
  • 相关阅读:
    LeetCode | Divide Two Integers
    LeetCode | Pow(x, n)
    LeetCode | Sqrt (x)
    LeetCode | 3 Sum
    LeetCode | Two Sum
    LeetCode | Pascal's Triangle II
    nodejs eclipse
    CentOS: Make Command not Found and linux xinetd 服务不能启动
    jquery将form表单序列化常json
    VMware Mac OS补丁安装
  • 原文地址:https://www.cnblogs.com/hupp/p/4742152.html
Copyright © 2011-2022 走看看