题目描述:
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
解决方案:[ 可行,但是提交超时 ]
我的第一个想法就是先翻转链表,把链表1->2->3->4->5
变成5->4->3->2->1
,然后遍历到k,得到5->4
,然后再将5->4
翻转成4->5
,得出结果,但是很遗憾,提交结果是时间超时。所以这个方案舍弃。
伪代码如下:
func getKthFromEnd(_ head: ListNode?, _ k: Int) -> ListNode? { let head = reverse() while k > 0 { head = head.next k -= 1 } return reverse() }
然后看了下别人的方案,发现一个非常巧妙的解法。
双指针法,定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个指针到达链表的尾结点时,第二个指针正好指向倒数第K个节点
代码如下:
func getKthFromEnd(_ head: ListNode?, _ k: Int) -> ListNode? { if head == nil || k == 0 { return nil } var count = k var first = head var second = head while count > 1 { //这里判断下 如果first.next 为空,说明,链表的长度不足k guard let node = first?.next else { return nil } first = node count -= 1 } while first?.next != nil { second = second?.next first = first?.next } return second } }
今天分享的内容短小精悍,是不是很简单,但是很巧妙。自己想,可能一会儿很难想到,所以平时多刷刷就行了。
欢迎关注【无量测试之道】公众号,回复【领取资源】
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、
资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。
备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:
添加关注,让我们一起共同成长!