hackerrank 和 leetcode的链表相关的题目的总结

1.给出一个单链表的head,要求从反向输出链表的数据

我是遍历一遍,用vector保存data,再反向输出

但是,递归是更好的方式

 

2.给一个单链表的head,要反转链表并返回新head

递归,也可以写成循环的模式

 

3.对边界情况考虑不够

对指针不熟

 

4.给出2个链表A,B,在某处相交,求交点处的data

我是2重循环直接写,显然是很差的做法

更好的做法,把A的节点的next=NULL,再遍历一遍B,此时B的终点就是交点

 

5.一个链接,别人的总结:

http://wuchong.me/blog/2014/03/25/interview-link-questions/

 

6.给出一个单向链表,输出该链表中倒数第k个,链表的倒数第0个节点为链表的尾指针

我的做法:先遍历一遍,得到链表的节点数,就得到了是正数第多少个,然后再遍历一遍

更好的做法:设置2个指针p1,p2,首先p1,p2都指向head,然后p2向前走k步,这样p1,p2之间就隔了k个,然后p1,p2同时向前走,直到p2到达链表末尾,这时候p1就是了

 

7.求链表的中间节点

如果链表的节点个数为偶数,则返回中间2个的任意一个

要求只能扫描一遍链表

和第6一样的思路,设置2个指针p1,p2,然后一个每次移动2步,一个每次只移动一步

 

8.判断单链表是否存在环

这个做法很巧妙,设置2个指针,从head出发,一个每次移动一步,一个每次移动2步,2个指针移动速度不一样,如果存在环,2个指针会在环里相遇。

如果有环的话,要找环的入口点?

确定有环后,让p2回到head,然后继续和p1同时走,不过这次每次都是走1步,则当p1,p2再次相遇的时候,就是环路的入口了

假设head到环的入口的距离为a,p1和p2交点与环入口点的距离为b,环的周长为l,当p1,p2第一次相遇的时候,假设p1走了n步,则有:

a + b  = n

a + b + k * l = 2 * n

则k * l = a + b = n,那么从相遇点开始,p1再走n步的话,还可以回到相遇点,同时p2从头开始走,经过n步,也会到达相遇点

在这个过程中p1,p2只有前a步走的路径不同,所以当p1和p2再次重合的时候,就是在链表的环的入口点

 

9.在链表的问题中,设置2个指针是很常见的解题思路。

 

posted on 2017-03-17 21:08  _fukua  阅读(267)  评论(0编辑  收藏  举报