输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
2018-03-01 12:53
991 查看
(1)链表为空的情况if(!pHead)
{
return;
}(2)链表只有一个节点的情况以及在遍历链表的过程中考虑当前只有一个结点的情况
从头遍历链表,对每一个节点复制一个,插在它后边;接着遍历这个链表,那么原链表中节点的特殊指针若为空,则复制链表对应节点的特殊指针也为空,若源链表中结点的特殊指针不为空,那复制链表中对应节点的特殊指针为原链表中结点特殊指针的->next。
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if (!pHead)
{
return NULL;
}
RandomListNode* pNode = pHead;
RandomListNode* nextNode = pNode->next;
while (pNode)
{
RandomListNode *temp = new RandomListNode(pNode->label);
pNode->next = temp;
temp->next = nextNode;
pNode = temp->next;//新的起点
if (pNode)
{
nextNode = pNode->next;//这里是判断链表本身只有一个结点时和遍历到最后时两种情况
}
}//每个节点复制一次,连接起来,间隔构成两个单链表
//下边是要扫描链表,求random指针
pNode = pHead;
while (pNode)
{
if (!pNode->random)
{
pNode->next->random = NULL;
}
else
pNode->next->random = pNode->random->next;
pNode = pNode->next->next;
}
//下边就是要拆开了
RandomListNode* ClonepHead = pHead->next;
RandomListNode* ClonepNode = ClonepHead;
pNode = pHead;
while (pNode)
{
pNode->next = ClonepNode->next;
pNode = pNode->next;
if (pNode)//遍历过程中需要判断链表本身只有一个结点时和遍历到最后时两种情况
{
ClonepNode->next = pNode->next;
ClonepNode = ClonepNode->next;
}
}
return ClonepHead;
}
};
{
return;
}(2)链表只有一个节点的情况以及在遍历链表的过程中考虑当前只有一个结点的情况
从头遍历链表,对每一个节点复制一个,插在它后边;接着遍历这个链表,那么原链表中节点的特殊指针若为空,则复制链表对应节点的特殊指针也为空,若源链表中结点的特殊指针不为空,那复制链表中对应节点的特殊指针为原链表中结点特殊指针的->next。
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if (!pHead)
{
return NULL;
}
RandomListNode* pNode = pHead;
RandomListNode* nextNode = pNode->next;
while (pNode)
{
RandomListNode *temp = new RandomListNode(pNode->label);
pNode->next = temp;
temp->next = nextNode;
pNode = temp->next;//新的起点
if (pNode)
{
nextNode = pNode->next;//这里是判断链表本身只有一个结点时和遍历到最后时两种情况
}
}//每个节点复制一次,连接起来,间隔构成两个单链表
//下边是要扫描链表,求random指针
pNode = pHead;
while (pNode)
{
if (!pNode->random)
{
pNode->next->random = NULL;
}
else
pNode->next->random = pNode->random->next;
pNode = pNode->next->next;
}
//下边就是要拆开了
RandomListNode* ClonepHead = pHead->next;
RandomListNode* ClonepNode = ClonepHead;
pNode = pHead;
while (pNode)
{
pNode->next = ClonepNode->next;
pNode = pNode->next;
if (pNode)//遍历过程中需要判断链表本身只有一个结点时和遍历到最后时两种情况
{
ClonepNode->next = pNode->next;
ClonepNode = ClonepNode->next;
}
}
return ClonepHead;
}
};
相关文章推荐
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
- 21.输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
- java实现输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
- 有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?
- 一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个rand指针指向这个链表中的一个随机节点或NULL,现在要求复制一个单链表来实现这个链表,返回复制后的新链表。
- 给定一个链表,链表的每一个节点包含三个属性:1、节点值;2、指向下一个结点的引用;3、随机指向链表内任意一个节点的引用,也能不指向任何节点。复制该链表
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- [阿里巴巴2015校园招聘]写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。 .
- 《剑指Offer》输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- java 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- 【剑指offer24】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。