一、复杂链表的复制
· 题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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);
}
};