一定要认真看分析|评论|题目要求问题1题目描述:输入一个链表,从头到尾打印链表每个节点的值。分析:因为链表只有知道当前节点才能知道下一个节点,所以不可能直接从后往前打印。我们经常使用栈的数据结构来解决这种倒序算法(策略),所以我们的基本思路是先把链表压入栈,然后再弹出,但是需要遍历两次才能得到答案,更神奇解决方法是将节点值插入数组头部一次,即可满足题目要求。代码如下:val=$x;}}*/functionprintListFromTailToHead($head){$stack=[];如果(!$head){返回$堆栈;}while($head){array_unshift($stack,$head->val);#array_unshift返回头插入后的数组单元数$head=$head->next;}return$stack;}测试地址:https://www.nowcoder.com/prac...第2题题目描述:输入一个链表,输出链表中的倒数第k个节点。分析:前提:链表是动态分配的,无法预先知道链表的总长度。大致思路:遍历链表,获取长度,输出节点。链表末尾),第二个指针指向倒计时k的位置,两者之差为(n-1)-(n-k)=k-1,让一个指针先指向k-1,而第二个指针停留在原地等待,然后让第二个指针和第一个指针同时走,走到尽头,找到k,代码如下:next!=null){$head=$head->next;}else{/*注意:这里有个隐藏条件,就是链表的长度可能小于k,当我们到达k-1时,链表就已经遍历过了,这也是非法的*/返回空值;}}/*当第一个指针走到k-1且不为空时,让第二个指针开始走。当第一个指针指向n-1时,第二个指针也指向倒数第二个k的位置就是你想要的*/while($head->next!=null){$head=$head->next;$behind=$behind->下一个;}返回$后面;}测试地址:https://www.nowcoder.com/prac...问题3题目描述:输入一个链表,反转链表,输出链表的所有元素分析:最好的画法图片是使用临时节点读取评论next;#首先将链上第二个位置的值放入临时容器$pHead->next=$cur;#给第二个位置赋null值,以保持链的关系$cur=$pHead;#将第一个位置的值赋给第二个位置$pHead=$tmp;#将原来第二个位置的值赋值给头节点}return$cur;}测试地址:https://www.nowcoder.com/prac...第4题题目描述:输入两个单调递增的链表,输出两个链表合成的链表。当然,我们需要合成链表满足单调非递减规则。分析:最好先用头节点比较图片大小,小的压入数组,一位后继续比较大小val=$x;}}*/functionMergeList($pHead1,$pHead2){//在这里写代码/*先用头结点比较大小,把小的压入数组,把大的压入数组}if($pHead1==null){返回$pHead2;}if($pHead2==null){返回$pHead1;}$目标=数组();if($pHead1!=null&&$pHead2!=null){#这里判断的目的是在递归过程中,可能有一方先遍历结束if($pHead1->val>=$pHead2->val){$target=$pHead2;$target->next=MergeList($pHead1,$pHead2->next);}else{$target=$pHead1;$target->next=MergeList($pHead1->next,$pHead2);}}返回$target;}测试地址:https://www.nowcoder.com/prac...第5题题目描述:给定一个链表1.判断链表是否有环2.分析链表的起始节点(入口节点)链表:最近段图好像有点问题。给我一个链接。环表函数EntryNodeOfLoop($pHead){//在这里写代码if($pHead==null){returnnull;}$fast=$pHead;$slow=$pHead;while($fast!=null&&$fast->next!=null){$fast=$fast->next->next;$slow=$slow->下一步;if($fast==$slow){#existenceloop$slow=$pHead;while($fast!=$slow){#此时slow是头节点$fast=$fast->next;$slow=$slow->下一步;}if($fast==$slow){返回$快;}}}returnnull;}第6题题目描述:《约瑟夫指环》是一道数学应用题:一群猴子围成一圈,按照1,2,...,n编号,然后从第一位开始数一、数到第m只猴子,把它踢出圈,从它后面开始数,再数到第m只猴子,把它踢出去……以此类推,直到只剩下一只猴子。那只猴子叫大王。需要编程模拟这个过程,输入m,n,输出最后一个王的编号。分析:列出的第一个猴子一定是a[1]=m(mod)n,假设猴子的新编号是i,它原来的编号是(i+a[1])%n/***@param$monkeysArray预设数组*@param$m.诠释。默认剔除数*@param$cur。诠释。标记*/functionJosephCircle($monkeys,$m,$current=0){$number=count($monkeys);$数=1;如果(计数($monkeys)==1){echo$monkeys[0];返回;}else{while($num++<$m){$current++;$current=$current%$number;}echo$monkeys[$current];array_splice($monkeys,$current,1);#剔除JosephCircle($monkeys,$m,$current);}}
