算法笔记-链表
来源:互联网 发布:广联达土建预算软件 编辑:程序博客网 时间:2024/06/05 11:01
链表结构如下:
struct ListNode{
int m_nValue;
ListNode * m_pNext;
};
1.输入一个链表,输出该链表中倒数第K个结点。
2.求链表的中间结点。如果链表中结点总数为奇数,返回中间结点,如果结点总数是偶数,返回中间两个结点的任意一个。
3.判断一个单向链表是否形成了环形结构。(如果是环形结构,则尾结点的下一个结点不一定是头结点,可能是链表中的任意一个结点)。
思路:
1.
解法1:
可以先遍历一遍链表,得到链表结点总数n,那么再从头结点开始往后走n-k+1步即可找到。
解法2:
定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动;第一个指针从第k步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个指针到达链表的尾结点时,第二个指针正好是倒数第K个结点。
注意:
如果k值为0,或者头结点为NULL,需要做空值处理,还有如果k值大于链表结点的个数,也需要作处理。
2.
定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。当走得快的指针走到链表的末尾时,走得慢的指针正好在链表的中间。
3.
定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步,如果走得快的指针追上了走得慢的指针,那么链表即是环形链表,如果走得快的指针走到了链表的末尾都没有追上走得慢的指针,那么链表就不是环形链表。
题目4:
复杂链表的复制:
链表结构为:
strut ComplexListNode{
int m_nValue;
ComplexListNode* m_pNext;
ComplexListNode* m_pSibling;
};
其中m_pSibling用于指向链表中任意一个结点或者置为NULL;
分析:
解法1:
借助哈希表,将源链表结点的指针和新链表的结点指针一一对应存到哈希表中,用于确定m_pSibling的指向
解法2:
分三步走:
(1):根据原始链表的每个结点N创建对应的N‘.把N'链接在每个N的后面,即在原来链表的每个元素中间插入对应的复制结点
(2):假设原始链表上的N的m_pSibling执行结点S,那么其对应复制出来的N’是N的m_pNext指向的结点,同样S‘也是S的m_pNext指向的结点
(3):把这个长链表拆分成两个链表:把奇数位置的结点用m_pNext连接起来就是原始链表,把偶数位置的结点用m_pNext链接起来就是复制出来的链表了。
题目5:
输入一棵二叉搜索树,将该搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路:
根节点的left指向左子树的最大结点,right指向右子树的最小结点
定义方法ConvertNode(BinaryTreeNode* pNode,BinaryTreeNode** pLastNodeInList)
其中pNode为当前要处理的(子)树的根结点,pLastNodeInList为当前已经处理好的双向链表的尾结点。
ConvertNode表示将当前的(子)树的根节点和已经部分存在的双向链表的尾结点处理,使得该子树整合到双向链表中,形成新的局部双向链表。
这样就可以写出递归代码:
void ConvertNode(BinaryTreeNode * pNode,BinaryTreeNode** pLastNodeInList)
{
if(pNode==null)return;
BinaryTreeNode *pCurrent=pNode;
if(pCurrent->left != NULL)
ConvertNode(pCurrent->left,pLastNodeInList);
pCurrent->left=*pLastNodeInList;
if(*pLastNodeInList != NULL)
(*pLastNodeInList)->right=pCurrent;
*pLastNodeInList=pCurrent;
if(pCurrent->right != NULL)
ConvertNode(pCurrent->right,pLastNodeInList);
}
- 算法笔记-链表
- 牛客网算法学习笔记-链表
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- 算法笔记
- python Beautiful Soup文档
- 代码 80072F76 Windows Update 遇到未知错误
- JQuery上传插件Uploadify详解及其中文按钮解决方案
- 最近点对 (分治)
- 自定义消息的参数传递
- 算法笔记-链表
- Shell文档
- Android的Application对象讲解
- 计算机科学中最重要的32个算法
- xml读写文件实例
- PogoPlug安装迷你云
- C#获取本地计算机证书信息
- Struts2中action获取request、response、session的方式
- 最大子数组算法