一、複雜鏈表的複製
· 題目描述
輸入一個複雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果爲複製後複雜鏈表的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);
}
};