您的位置:首页 > 职场人生

面试题:复杂链表的复制

2017-07-19 13:13 218 查看
题目:复制一个复杂链表。复杂链表就是在链表中的每个结点除了有一个

_next指针指向下一个结点外,还有一个_sbiling指针指向NULL或链表中的任意一个结点。

复杂链表的复制分为以下三步。

1、根据原始链表的每个结点N创建对应的结点N’,并把N’链接在N后面。



void CloneNode(Node* head)
{
Node* node = head;
while (node!=NULL)
{
//复制结点
Node* CNode = new Node(0);
CNode->_data = node->_data;
CNode->_next = node->_next;
CNode->_sibling = NULL;
node->_next = CNode;
node=CNode->_next;
}
}


2、设置复制出来结点的_sibling。假设原链表结点N的_sibling指向结点S,那么复制出来的结点N’就是N的_next,故N’的_sibling就指向S的_next S’。



void Connect(Node* head)
{
Node* node = head;
while (node != NULL)
{
Node* CNode = node->_next;
if (node->_sibling != NULL)
CNode->_sibling = node->_sibling->_next;
node = CNode->_next;
}
}


3、把长链表分成两个链表。把奇数位的结点连接起来就是原链表,把偶数位的结点连接起来就是复制的链表。



Node* recopy(Node* head)
{
Node* node = head;
Node* CNode = NULL;
Node* CNhead = NULL;
if (node != NULL)
{
CNhead =CNode= node->_next;
node->_next = CNode->_next;
node = node->_next;
}
while (node != NULL)
{
CNode->_next = node->_next;
CNode = CNode->_next;
node->_next = CNode->_next;
node = node->_next;
}
return CNhead;
}


整体代码:

struct Node
{
int _data;
Node* _next;
Node* _sibling;
Node(int data)
:_data(data)
{}
};

Node* clone(Node* head)
{
CloneNode(head);
Connect(head);
Node* CNhead = recopy(head);
return CNhead;
}

void test1()
{
Node* head;
Node* n1 = new Node(1);
Node* n2 = new Node(2);
Node* n3 = new Node(4);
Node* n4 = new Node(5);
Node* n5 = new Node(6);
Node* n6 = new Node(7);
head = n1;
n1->_next = n2;
n2->_next = n3;
n3->_next = n4;
n4->_next = n5;
n5->_next = n6;
n6->_next = NULL;

n1->_sibling = NULL;
n2->_sibling = n4;
n3->_sibling = n6;
n4->_sibling = NULL;
n5->_sibling = n3;
n6->_sibling = NULL;

Node* m = clone(head);

}
int main()
{
test1();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: