复制复杂(多指针)链表
来源:互联网 发布:显示网络存在安全隐患 编辑:程序博客网 时间:2024/05/21 10:13
题目:
复杂链表的复制。 在此链表中,每个节点不光含有一个指向下一个节点的next指针,还有一个指针any,指向链表中任意节点或者 NULL。如图:
__________
V |
A ---> B ---> C ---> D ---> E --->F
| |____^__________^
|__________|
方法一:
第一步:先复制原链表中的每一个节点。
第二步:由于每一个节点上还有一个any指针需要填充,所以第二步依次遍历每一个节点在原链表中的位置,并依次填充。代码略。
此算法的复杂度:O(n^2)
算法二将对此做了优化,算法复杂度为:O(n)
方法二:
假设复杂链表用N表示,
第一步:给每一个N创建一个新的节点N',然后把创建好的每一个N'添加在N的后面。
第二步:通过遍历一次链表,将复制后的N'从长链表中分离出来,组成一个新的链表,新的链表即为复制后的复杂链表。
此算法的复杂度:O(n)
代码:
#include <stdio.h>#include <stdlib.h>
//声明节点样子typedef struct node{char ch;struct node* next;struct node* any;}Node;//显示链表void show(Node* phead){Node* tmp = phead;while(tmp != NULL){printf("%c\t", tmp->ch);if(tmp->any != NULL)printf("%c any is: %c\n", tmp->ch, tmp->any->ch);else printf("%c any is NULL\n", tmp->ch);tmp = tmp->next;}printf("\n");}
//创建复杂链表Node* create(Node* phead, char ch){Node* tmp = malloc(sizeof(Node));tmp->ch = ch;tmp->next = NULL;tmp->any = NULL;Node* find = phead;if(phead == NULL)phead = tmp;else {while(find->next != NULL)find = find->next;find->next = tmp;}return phead;}
//给链表中的另一个指针any赋值void create_complex_list(Node* phead){Node* tmp = phead;tmp = tmp->next;Node* A = phead;A->any = tmp->next;Node* B = tmp;tmp = tmp->next->next;Node* D = tmp;D->any = B;tmp = tmp->next;B->any = tmp; }
//删除链表void destory(Node* phead){Node* tmp = NULL;while(phead){tmp = phead;phead = phead->next;free(tmp);}}// 复制N节点为N',并加在N的后面,合成一条长链表void clone_nodes(Node* phead){Node* clone = phead;if(phead == NULL){printf("Head is NULL. \n");exit(1);}while(clone != NULL){Node* tmp = malloc(sizeof(Node));tmp->ch = clone->ch;tmp->next = clone->next;tmp->any = clone->any;clone->next = tmp;clone = tmp;clone = clone->next;}}//将长链表中的N'分离出来,形成新的复杂链表Node* separate_nodes(Node* phead){int count = 0 , i = 1;Node* newhead = NULL;Node* newtail = NULL;Node* tmp = phead;while(tmp != NULL){count++;tmp = tmp->next;} Node* find = phead;while(find != NULL){if(find->ch == find->next->ch){tmp = find->next;find->next = tmp->next;tmp->next = NULL;if(newhead == NULL){newhead = tmp;newtail = newhead;} else {newtail->next = tmp;newtail = newtail->next;}}find = find->next;}return newhead;}int main(){Node* head = NULL;head = create(head, 'A');create(head, 'B');create(head, 'C');create(head, 'D');create(head, 'E');create(head, 'F');// 创建一个复杂的链表create_complex_list(head);printf("复制前: \n");show(head); // 复制N节点为N',并加在N的后面,合成一条长链表clone_nodes(head); /********************************************** 将长链表中的N'分离出来,合成一条短的链表,此 链表为复制后的复杂链表。 ***********************************************/Node* new = separate_nodes(head);printf("复制后: \n");show(new);destory(head);return 0;}结果:
0 0
- 复制复杂(多指针)链表
- 复杂链表的复制(结点包含随机指针)
- LintCode(M) 复制带随机指针的复杂链表
- 复杂指针的定义(含复杂函数指针)
- 复杂指针
- 复杂指针
- 复杂指针
- 复杂指针
- 复杂指针
- 复杂指针
- 复杂指针
- 复杂链表的复制(复制含有随机指针节点的链表)
- 链表5:复杂链表的复制
- 链表16:复杂链表的复制
- 链表—复杂链表的复制
- 【链表】复杂链表的复制
- 链表--复杂链表的复制
- 复杂链表的复制(二)
- 【安卓逆向】如何不用设置debuggable="true"就可以动态调试
- 从零开始学算法(四)搜索算法(二)(广度优先搜索)
- python读取excel
- EditText的imeOptions属性的使用
- 嵌入式linux永不关闭屏幕
- 复制复杂(多指针)链表
- JavaScropt基础
- 页面性能优化的利器—Timeline
- PHP开发记录
- mysql UNIX时间戳与日期的相互转换
- OpenDaylight-Boron学习笔记:1 实验环境搭建说明
- Servlet基础总结(2)
- Linux jdk环境变量配置与详解
- Spring+MyBatis+JUnit+Maven创建项目实例