算法笔记-链表

链表结构如下:

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);

}

这是一本零基础就能读懂的算法书籍,读者不需要因为自己没有语言基础而畏惧。书籍的第2章便是一个C语言的入门教程,内容非常易懂,并且十分实用,阅读完这章就可以对本书需要的C语言基础有一个较好的掌握。本书已经覆盖了大部分基础经典算法,不仅可以作为考研机试和PAT的学习教材,对其他的一些算法考试(例如CCF的CSP考试)或者考研初试的数据结构科目的学习和理解也很有帮助,甚至仅仅想学习经典算法的读者也能从本书中学到许多知识,本书还有配套的《算法笔记上机训练实战指南》本书的作者是同样经历过考研机试和各类算法考试的专家型学长,知晓这类考试中的痛点,以及考生在学习算法时容易产生困惑的地方,因此可以把本书看作是学长为你奉献的满满的经验干货,这是最有价值的东西。本书的最个试印版本献给了浙大考研学子,并令当年的浙大考研机试平均分增加了十多分,收获了考生的大量好评。但作者并没有止步于此,经过了半年多时间的内容完善和补充之后,新的版本在新一年的考研机试中再次获得了考生的一致赞美。最后,在经过精心整理之后,书籍终于定稿,并编撰成书。我们知道,纸质书籍的一个弱点就在于不能像软件一样随时更新内容,但本书采用了与二维码相结合的方式,使得本书变为能够随时更新内容的书籍,读者也可以随时从二 维码中找到勘误。这种作者和读者能够相互沟通的方式让书籍变“活”了,也能够帮助提升读者对知识的理解。 本书内容包括:C/C++快速入门、入门模拟、算法初步、数学问题、C++标准模板库(STL)、数据结构专题(两章)、搜索专题、图算法专题、动态规划专题、字符串专题、专题扩展。书中每小节的末尾均印有二维码,用以实时更新或补充书籍的内容及发布本书的勘误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值