链表13——找链表的倒数第K个元素

Posted 纵横千里,捭阖四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表13——找链表的倒数第K个元素相关的知识,希望对你有一定的参考价值。

​本篇应该是我们更新这么多期以来最轻松的一篇了。

这个题在LeetCode中没有原题,而且也不算很难,与前面的文章每篇都足够烧脑相比,不足以单独成篇。但是这个题在剑指offer中有,在其他材料出现频率也非常高,据说很多人面试也都遇到过,所以我们还是单独讨论一下吧。

经过前面删除小专题的折磨,这个题就是小儿科了,特别是《链表中删除元素的8道题之二》一文中,我们不但要找到倒数第N个还要将满足条件的元素删除。

这个题目的找法主要是三种:

  1. 两次遍历法,第一轮遍历确定链表的长度,计算出倒数的位置是LEN-K+1。第二轮重新定位到LEN-K+1,执行相关的处理。

  2. 使用栈,先将所有元素压栈,然后弹出第n个的时候就是需要的。

  3. 使用双指针,一个first指针先走n步,然后second再开始走,当first到达终点的时候,second的位置就是要找的。

我们来具体的看看题目

1.剑指offer 22题:链表中倒数第K个结点

我们先看一下题意:

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

 示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.

如果采用双指针,可以这么写:

class Solution {    public ListNode getKthFromEnd(ListNode head, int k) {        ListNode pre = head;        ListNode curr = head;        while(curr!=null){            curr = curr.next;            if(k>0)                k--;            else{                pre = pre.next;            }        }        return pre;    }}

其他两种方式我们在《链表中删除元素的8道题之二》中已经介绍了,这里就不再赘述。

以上是关于链表13——找链表的倒数第K个元素的主要内容,如果未能解决你的问题,请参考以下文章

python代码找到链表的倒数第K个节点并打印

Q:链表的倒数第K个元素

[PHP] 算法-请找出带环链表的环的入口结点的PHP实现

查看链表的中间结点,链表的逆序,返回链表倒数第k个结点

链表例题2:链表的倒数第k个节点是多少

输出链表的倒数第K个值