链表面试题之复杂链表的复制
2017-06-15 21:45
281 查看
复杂链表的复制:一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个RandNext指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。
//ps: 复杂链表的结构
struct ComplexNode
{
int data ; // 数据
struct ComplexNode * next; // 指向下一个节点的指针
struct ComplexNode * RandNext; // 指向随机节点(可以是链表中的任意节点 or 空)
};
我们可以看出规律,要复制原链表,就是原链表节点randnext指向的节点的next赋给原链表节点的next的randnext
分离两个链表
测试结果:
//ps: 复杂链表的结构
struct ComplexNode
{
int data ; // 数据
struct ComplexNode * next; // 指向下一个节点的指针
struct ComplexNode * RandNext; // 指向随机节点(可以是链表中的任意节点 or 空)
};
方法一,先创建一个新链表在没有RandNext时与复杂链表完全相同,然后再通过遍历复杂链表的方法,一一给新链表的RandNext赋值,这样显然比较复杂。所以我们还有另一种方法
方法二:
在复杂链表的每一个节点后面加一个节点的复制,链成一个新的链表我们可以看出规律,要复制原链表,就是原链表节点randnext指向的节点的next赋给原链表节点的next的randnext
分离两个链表
//添加新的节点,并赋值 void ListInser(ListNode **ppList, int x) { *ppList = (ListNode *)malloc(sizeof(ListNode)); (*ppList)->data = x; } ListNode *ListCopy(ListNode *pList) //复杂链表的复制 { if(pList == NULL) { return NULL; } ListNode *cur = pList; ListNode* NewListNode = NULL; while(cur != NULL) { ListInser(&NewListNode, cur->data);//添加节点 NewListNode->next = cur->next;//新节点插到该节点的后面 cur->next = NewListNode; cur = cur->next->next;//向后走 } cur = pList; while(cur) { cur->next->RandNext = cur->RandNext->next; //2.randnext的赋值 cur = cur->next->next; } NewListNode = pList->next;//新链表头指针为NewListNode cur = pList; ListNode *Newcur = NewListNode; while(cur)//分离链表 { cur->next = cur->next->next;// Newcur->next = cur->next; cur = cur->next; Newcur = Newcur->next; } return NewListNode; }
测试结果:
相关文章推荐
- Java面试题-实现复杂链表的复制代码分享
- 【剑指Offer面试题】 九度OJ1524:复杂链表的复制
- 剑指offer_面试题26_复杂链表的复制
- 剑指offer 面试题26 复杂链表的复制
- 剑指offer之面试题26:复杂链表的复制
- 剑指offer 面试题26 复杂链表的复制
- 【剑指offer】面试题35:复杂链表的复制
- 剑指offer面试题26:复杂链表的复制
- 面试题26:复杂链表的复制
- 【剑指Offer学习】【面试题26:复杂链表的复制】
- 剑指Offer_面试题26_复杂链表的复制
- 【面试题026】复杂链表的复制
- 剑指Offer面试题26复杂链表的复制,面试题27二叉搜索树和双向链表(递归)
- 【剑指offer】4.4分解让复杂问题简单化——面试题26:复杂链表的复制
- 面试题26 复杂链表的复制
- 剑指offer面试题26:复杂链表的复制Java实现
- 【单链表面试题】------复杂链表的复制
- 面试题26:复杂链表的复制
- 面试题26:复杂链表的复制
- 剑指offer之面试题25:复杂链表的复制