《劍指offer》——複雜鏈表的複製、二叉搜索樹與雙向鏈表

一、複雜鏈表的複製

· 題目描述

        輸入一個複雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果爲複製後複雜鏈表的head。(注意,輸出結果中請不要返回參數中的節點引用,否則判題程序會直接返回空)

· 解題思路

        本題目的思路是分三步完成複雜鏈表的複製過程:

        1、將鏈表中的每個節點都複製一遍,並且每個新複製的節點都跟在被複制的節點的後面。

        2、爲每個緊跟着的新複製的節點賦上特殊指針的值。

        3、根據奇偶性將原始鏈表和新複製的鏈表分離開

class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        if(pHead==nullptr)
            return NULL;
        CloneNode(pHead);  //第一步
        CloneSiblingNode(pHead);  //第二步
        return Depart(pHead);   //第三步
    }
    //進行第一步
    void CloneNode(RandomListNode* pHead)
    {
        RandomListNode* pNode=pHead;
        while(pNode!=nullptr)
        {
            RandomListNode* pClone=new RandomListNode(pNode->label);
            pClone->next=pNode->next;
            pClone->random=nullptr;
            pNode->next=pClone;
            pNode=pClone->next;
        }
    }
    //進行第二步
    void CloneSiblingNode(RandomListNode* pHead)
    {
        RandomListNode* pNode=pHead;
        while(pNode!=nullptr)
        {
            RandomListNode* pClone=pNode->next;
            if(pNode->random!=nullptr)
                pClone->random=pNode->random->next;
            pNode=pClone->next;
        }
    }
    //進行第三步
    RandomListNode *Depart(RandomListNode* pHead)
    {
        RandomListNode* pNode=pHead;
        RandomListNode* pCloneHead=pNode->next;
        while(pNode!=nullptr)
        {
            RandomListNode* pCloneNode=pNode->next;
            pNode->next=pCloneNode->next;
            pNode=pNode->next;
            if(pNode!=nullptr)
                pCloneNode->next=pNode->next;
        }
        return pCloneHead;
    }
};

二、二叉搜索樹與雙向鏈表

· 題目描述

        輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。

· 解題思路

        本題考慮用遞歸的思路來解決,通過中序遍歷保存根節點到鏈表中,然後鏈表左邊部分即爲左子樹,右邊部分即爲右子樹。

class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        TreeNode *pLastNodeInList=nullptr;
        ConvertNode(pRootOfTree,&pLastNodeInList);
        TreeNode *pHeadOfList=pLastNodeInList;
        while(pHeadOfList!=nullptr&&pHeadOfList->left!=nullptr)
            pHeadOfList=pHeadOfList->left;
        return pHeadOfList;
    }
    void ConvertNode(TreeNode* pNode,TreeNode** pLastNodeInList)
    {
        if(pNode==nullptr)
            return;
        TreeNode *pCurrent=pNode;
        if(pCurrent->left!=nullptr)
            ConvertNode(pCurrent->left,pLastNodeInList);
        pCurrent->left=*pLastNodeInList;
        if(*pLastNodeInList!=nullptr)
            (*pLastNodeInList)->right=pCurrent;
        *pLastNodeInList=pCurrent;
        if(pCurrent->right!=nullptr)
            ConvertNode(pCurrent->right,pLastNodeInList);
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章