1 / 54
文档名称:

算法大全-面试题-数据结构.docx

格式:docx   大小:39KB   页数:54页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

算法大全-面试题-数据结构.docx

上传人:bdjigr52 2019/10/19 文件大小:39 KB

下载得到文件列表

算法大全-面试题-数据结构.docx

文档介绍

文档介绍:一、,其中每个元素都含有一个指向一个单链表的指针。写程序把这个二级链表称一级单链表。(不包括表头)?如何找到环的“起始”点?如何知道环的长度?,#实现,这是我们的基石:lassLink{publicLinkNext;publicstringData;publicLink(Linknext,stringdata){=next;=data;}}其中,我们需要人为地在单链表前面加一个空节点,称其为head。例如,一个单链表是1->2->5,如图所示:对一个单链表的遍历如下所示:staticvoidMain(string[]args){Linkhead=GenerateLink();Linkcurr=head;while(curr!=null){();curr=;}},既然是要反转,那么肯定是要破坏原有的数据结构的:算法1:我们需要额外的两个变量来存储当前节点curr的下一个节点next、再下一个节点nextnext:publicstaticLinkReverseLink1(Linkhead){Linkcurr=;Linknext=null;Linknextnext=null;//ifnoelementsoronlyoneelementexistsif(curr==null||==null){returnhead;}//ifmorethanoneelementwhile(!=null){next=;//1nextnext=;//=;//=next;//=nextnext;//5}returnhead;}算法的核心是while循环中的5句话我们发现,curr始终指向第1个元素。此外,出于编程的严谨性,还要考虑2种极特殊的情况:没有元素的单链表,以及只有一个元素的单链表,都是不需要反转的。算法2:自然是递归如果题目简化为逆序输出这个单链表,那么递归是很简单的,在递归函数之后输出当前元素,这样能确保输出第N个元素语句永远在第N+1个递归函数之后执行,也就是说第N个元素永远在第N+1个元素之后输出,最终我们先输出最后一个元素,然后是倒数第2个、倒数第3个,直到输出第1个:publicstaticvoidReverseLink2(Linkhead){if(!=null){ReverseLink2();();}}但是,现实应用中往往不是要求我们逆序输出(不损坏原有的单链表),而是把这个单链表逆序(破坏型)。这就要求我们在递归的时候,还要处理递归后的逻辑。首先,要把判断单链表有0或1个元素这部分逻辑独立出来,而不需要在递归中每次都比较一次:publicstaticLinkReverseLink3(Linkhead){//ifnoelementsoronlyoneelementexistsif(==null||==null)returnhead;=ReverseLink();returnhead;}我们观测到:=ReverseLink();这句话的意思是为ReverseLink方法生成的逆序链表添加一个空表头。接下来就是递归的核心算法ReverseLink了:staticLinkReverseLink(Linkhead){if(==null)returnhead;LinkrHead=ReverseLink();=head;=null;returnrHead;}算法的关键就在于递归后的两条语句:=head;//=null;//2啥意思呢?画个图表示就是:这样,就得到了一个逆序的单链表,我们只用到了1个额外的变量rHead。