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

 

转载于:https://www.cnblogs.com/-maybe/p/6568363.html

leetcode 凑硬币 :open_file_folder: 算法 :page_facing_up: :open_file_folder: 黑客等级 :open_file_folder: 数组 :open_file_folder: 2_-_中 :page_facing_up: :open_file_folder: 堆 :open_file_folder: 1_-_简单 :page_facing_up: :open_file_folder: Linked_Lists :open_file_folder: 2_-_中 :page_facing_up: :open_file_folder: 队列 :open_file_folder: 3_-_硬 :page_facing_up: :open_file_folder: 递归 :open_file_folder: 2_-_中 :page_facing_up: :open_file_folder: 排序 :open_file_folder: 2_-_中 :page_facing_up: :open_file_folder: 堆栈 :open_file_folder: 3_-_硬 :page_facing_up: :page_facing_up: :open_file_folder: 力码 :open_file_folder: 大批 :open_file_folder: 1_-_简单 :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :open_file_folder: 2_-_中 :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :open_file_folder: 3_-_硬 :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :open_file_folder: 位操作 :open_file_folder: 1_-_简单 :page_facing_up: :open_file_folder: DP :open_file_folder: 1_-_简单 :page_facing_up: :open_file_folder: 2_-_中 :page_facing_up: :page_facing_up: :page_facing_up: :page_facing_up: :open_file_folder: 深度优先_搜索,广度优先_搜索 :open_file_folder: 1_-_简单 :page_facing_up: :open_file_folder: 2_-_中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值