zoukankan      html  css  js  c++  java
  • 链表中倒数第K个结点

    题目:输入一个链表,输出该链表中倒数第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始他们的值一次是1、2、3、4、5、6.这个链表的倒数第3个结点是值为4的结点。

    解题思路:本题中所给的链表是单向链表,单向链表的结点只有从前往后的指针而没有从后往前的指针。

    假设链表有n个结点,那么倒数第k个结点就是从头结点开始的第n-k+1个结点。如果我们能够得到链表中结点的个数n,那么我们就只要从头开始往后走n-k+1步就可以了。如何得到结点的个数n?这个不难,只需要从头开始遍历链表,每经过一个结点,计数器加1就行了。

    也就是说我们需要遍历链表两次,第一次统计出链表中结点的个数,第二次就能找到倒数第k个结点。但是当我们把这个思路解释给面试官之后,他会告诉我们他期待的解法只需要遍历链表一次。

    为了实现只遍历链表一次就能找到倒数第k个结点,我么可以定义两个指针。第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动;从第k步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当前一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。

     

    注:(a)第一个指针在链表上走两步。(b)把第二个指针指向链表的头结点。(c)两个指针一同沿着链表向前走。当第一个指针指向链表的尾结点时,第二个指针指向倒数第3个结点。

    相关题目:

    求链表的中间结点。如果链表中结点总数为奇数,返回中间结点;如果结点总数是偶数,返回中间两个结点的任意一个。为了解决这个问题,我们也可以定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。当走的快的指针走到链表的末尾时,走的慢的指针正好在链表的中间。

    判断一个单向链表是否形成了环形结构。和前面的问题一样,定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走的快的指针追赶上了走的慢的指针,那么链表就是环形链表;如果走的快的指针走到链表的末尾(m_pNext指向NULL)都没有追上第一个指针,那么链表就不是环形链表。

  • 相关阅读:
    iOS越狱后必装软件
    构建iOS交叉编译环境
    pycurl库使用详解
    iFiles浏览iphone文件
    Iphone通过ssh进行访问
    YShow性能测试平台搭建
    from my mac
    LR性能分析
    react服务端渲染(七)redux添加
    react服务端渲染(六)路由
  • 原文地址:https://www.cnblogs.com/zhibei/p/9208255.html
Copyright © 2011-2022 走看看