链表13——找链表的倒数第K个元素
Posted 纵横千里,捭阖四方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表13——找链表的倒数第K个元素相关的知识,希望对你有一定的参考价值。
本篇应该是我们更新这么多期以来最轻松的一篇了。
这个题在LeetCode中没有原题,而且也不算很难,与前面的文章每篇都足够烧脑相比,不足以单独成篇。但是这个题在剑指offer中有,在其他材料出现频率也非常高,据说很多人面试也都遇到过,所以我们还是单独讨论一下吧。
经过前面删除小专题的折磨,这个题就是小儿科了,特别是《链表中删除元素的8道题之二》一文中,我们不但要找到倒数第N个还要将满足条件的元素删除。
这个题目的找法主要是三种:
-
两次遍历法,第一轮遍历确定链表的长度,计算出倒数的位置是LEN-K+1。第二轮重新定位到LEN-K+1,执行相关的处理。
-
使用栈,先将所有元素压栈,然后弹出第n个的时候就是需要的。
-
使用双指针,一个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个元素的主要内容,如果未能解决你的问题,请参考以下文章