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个指针是很常见的解题思路。