链表含有随机rand指针的复制
2012-11-24 16:23
531 查看
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; class Node { public: Node* next; Node* rand; int value; }; Node* copy_list_with_rand_ptr(Node* list) { if(list == NULL) { return NULL; } /* * 参考:http://hi.baidu.com/gkqofoydngbjqtq/item/6345d6104b7a8d06e65c36a3 * 1、复制链表中的每一个节点放到自己的next * 2、修改偶数位置的节点的rand为rand-->next * 3、将链表分离,奇数节点组成原链表,偶数为复制的结果 * */ //第一步 Node* p = list; while( p ) { //复制节点 Node* n = new Node();//内存不足没有考虑 n->rand = p->rand; n->value = p->value; //插入链表 n->next = p->next; p->next = n; p = n->next; } //第二步,修改rand指针 p = list; while( p ) { p = p->next; p->rand = p->rand->next; p = p->next; } //第三步 p = list; Node* result = list->next; Node* t = result; while( p ) { p->next = t->next; p = p->next; if( p ) { t->next = p->next; t = t->next; } else { t->next = NULL; } } return result; } void print_list(Node* list) { printf("\n"); if( list == NULL) { return; } while( list ) { printf("next=%x, rand=%x, value=%d\n", int(list->next), int(list->rand), list->value); list = list->next; } printf("\n"); } int main() { const int N = 10; Node ns ; for(int i = 0; i < N; i++) { if(i < N-1) { ns[i].next = &ns[i+1]; } else { ns[i].next = NULL; } ns[i].rand = &ns[rand() % N]; ns[i].value = i; } print_list(ns); Node* copied = copy_list_with_rand_ptr(ns); print_list(copied); return 0; }
相关文章推荐
- 复制含有随机指针的链表
- 一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个rand指针指向这个链表中的一个随机节点或NULL,现在要求复制一个单链表来实现这个链表,返回复制后的新链表。
- 复制含有随机指针节点的链表
- 复杂链表的复制(复制含有随机指针节点的链表)
- 复制含有随机指针节点的链表——C++实现
- 复制含有随机指针节点的链表
- 链表问题---复制含有随机指针节点的链表
- 复制含有随机指针节点的链表
- 算法系列之-复制含有随机指针的链表
- 如何复制一个含有随机指针节点的链表
- 链表问题——复制含有随机指针节点的链表
- LeetCode OJ 之 Copy List with Random Pointer(复制含有随机指针的链表)
- 复制一个带随机指针的链表
- lintcode 复制带随机指针的链表(105)
- 含有random指针的链表复制
- 复制带随机指针的链表
- 复杂链表的复制(结点包含随机指针)
- 带随机指针的链表复制问题
- LintCode 105-复制带随机指针的链表
- 复制带随机指针的链表