题解 | #链表中倒数最后k个结点#

链表中倒数最后k个结点

http://www.nowcoder.com/practice/886370fe658f41b498d40fb34ae76ff9

描述

输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。

解题思路

将倒数第K个转为正数第index个 时间复杂度为O(n),空间复杂度为O(1)

func FindKthToTail( pHead *ListNode ,  k int ) *ListNode {
    count := 0
    head := pHead
    for head != nil {
        // 计算链表长度
        count++
        head = head.Next
    }
        // 将倒数第k个转为正数第index个
    index := count - k
        // 如果超出链表长度限制
    if index < 0{
        return nil
    }
    for pHead != nil && index > 0 {
        index--
                // 去掉多余的节点
        pHead = pHead.Next
    }
    return pHead
    // write code here
}

快慢指针实现 时间复杂度为O(n),空间复杂度为O(1)

  1. 因为是倒数第k个,所以我们先让快指针先走k步
  2. 如果fast指针为null,那么说明超过了链表长度限制,返回null
  3. 如果fast走了k步,且不为null,那么我们再用慢指针从头节点和快指针一起走,直到快指针为null.返回慢指针
     public ListNode FindKthToTail(ListNode pHead, int k) {
         // 判断链表头是否为空
         if (pHead == null) {
             return null;
         }
         // 将快指针指向头节点
         ListNode fast = pHead;
         int i = 0;
         while (k > i) {
             // 当fast为空表示越界
             if (fast == null){
                 return null;
             }
             // 继续向后走
             fast = fast.next;
             i++;
         }
         // 将慢指针指向链表头
         ListNode slow = pHead;
         // 循环结束的条件为快指针走到结尾
         while (fast != null) {
             fast = fast.next;
             slow = slow.next;
         }
         // 返回慢指针
         return slow;
     }

    快慢指针算法图例,以k等于2来举例,链表为1->2->3->4->5

    图片说明
全部评论

相关推荐

最近拿到了正浩的提前批offer感觉自己的实力得到了肯定,也给了我更多底气
搞机墨镜猫:正浩提前批官网好像就只有电力电子软硬件,哥们投的是这两个岗位吗
26届校招投递进展
点赞 评论 收藏
分享
05-26 10:24
门头沟学院 Java
qq乃乃好喝到咩噗茶:其实是对的,线上面试容易被人当野怪刷了
找工作时遇到的神仙HR
点赞 评论 收藏
分享
05-21 15:47
门头沟学院 Java
浪漫主义的虹夏:项目有亮点吗,第一个不是纯玩具项目吗,项目亮点里类似ThreadLocal,Redis储存说难听点是花几十分钟绝大部分人都能学会,第二个轮子项目也没体现出设计和技术,想实习先沉淀,好高骛远的自嗨只会害了自己
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务