链表复制算法
来源:互联网 发布:红三兵炒股软件 编辑:程序博客网 时间:2024/05/16 12:21
问题
已知一个简单链表,请复制链表并返回头结点指针。
解法1:遍历算法
从头开始遍历原链表,依次复制链表各个节点。
结点定义如下:
struct node { int data; struct node* next;};typedef struct node* pNode;创建新结点newNode代码:
pNode newNode(int data){ pNode nd = (pNode)malloc(sizeof(node)); nd->data = data; nd->next = NULL; return nd;}
复制链表函数,注意第一个结点的特殊情况。此外保留有尾结点指针,便于新结点插入到链表中。
struct node* copyList(struct node* head) { struct node* current = head; struct node* newList = NULL; //新链表的头指针 struct node* tail = NULL; // 新链表的尾部指针 while (current != NULL) { if (newList == NULL) { // 特殊情况,第一个新结点 newList = newNode(current->data); tail = newList; } else { tail->next = newNode(current->data); tail = tail->next; } current = current->next; } return(newList);}如果要把第一个新结点这种特殊情况一起考虑,则可以使用指向指针的指针来实现。代码如下:
void push(struct node** headRef, int data){ pNode nd = newNode(data); nd->next = *headRef; *headRef = nd;}struct node* copyListWithRef(struct node* head){ struct node* current = head; struct node* newList = NULL; struct node** lastPtr = &newList; while (current != NULL) { push(lastPtr, current->data); lastPtr = &((*lastPtr)->next); current = current->next; } return newList;}
解法2:递归算法
使用递归使得代码量很少,逻辑也很清晰。主要思路是首先复制原链表头结点,递归调用函数复制链表的剩下部分,并设置新链表头结点的next域指向复制的剩下部分链表。代码如下:
pNode copyListRecursive(pNode head){ if (head == NULL) return NULL; else { pNode newList = newNode(head->data); //复制原链表头结点,新链表头部指向它 newList->next = copyListRecursive(head->next); //新链表的next指向复制的剩下链表部分 return newList; }}
- 链表复制算法
- 算法题:复制复杂链表之复制连接法
- [算法学习]复杂链表的复制
- 链表复制算法的变体
- 算法题:复杂链表的复制
- 算法题35 复杂链表的复制
- 面试算法(二十五)复杂链表的复制
- 九章算法面试题18 复制链表
- 算法题26 复杂链表的复制
- 剑指Offer___关于复杂链表的复制算法剖析
- 面试算法:双指针单向链表的自我复制
- 复制链表的复制
- 剑指Offer算法实现之二十六:复杂链表的复制
- 程序员面试题精选100题(49)-复杂链表的复制[算法]
- 算法题:复制复杂链表之空间换时间法
- 程序员面试题精选100题(49)-复杂链表的复制[算法]
- 链表相关算法小结(判断环、复制、逆序等)
- 二叉树采用二叉链表存储,复制二叉树的算法(树的应用)
- STL源码剖析---红黑树原理详解下
- 使用openCV画出一幅图像的直方图
- 面试笔试问题:大数据量,海量数据 处理方法总结
- poj2378 Tree Cutting
- .NET+IIS环境常见问题排障
- 链表复制算法
- 21天学会java-javaee-c++
- 牛逼程序员给菜鸟的忠告
- Visual Studio .NET中的Web项目和源代码管理集成
- 【ZT】哈希的原理和代价
- 用VC++建立Service服务应用程序
- C51中的code关键字
- poj3259
- 防止查看页面源代码的方法