LeetCode-剑指offer22:链表中倒数第k个节点

题目描述:

输入一个链表,输出该链表中倒数第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自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:


添加关注,让我们一起共同成长!

posted on 2021-08-18 16:40  Wu_Candy  阅读(31)  评论(0编辑  收藏  举报