剑指offer十四之链表中倒数第k个结点

一、题目

输入一个链表,输出该链表中倒数第k个结点。

二、思路

  两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。

三、代码

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
      if(head==null || k<=0){
            return null;
        }

        ListNode pre=head;
        ListNode last=head;

        for(int i=k-1;i>0;i--){ //移动k-1步,移动到第k个节点
            if(last.next!=null){
            last=last.next;
            }else {
                return null;
            }
        }

        while (last.next!=null){
            last=last.next;
            pre=pre.next;  //同步移动
        }
        return pre;
    }
}

-----------------------------------------------------------------------------------------------------

参考链接:https://www.nowcoder.com/questionTerminal/529d3ae5a407492994ad2a246518148a

时间: 2024-10-29 10:26:41

剑指offer十四之链表中倒数第k个结点的相关文章

【剑指offer】九,链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 分析:此题为常见的快慢指针问题,java实现时要注意空指针错误以及边界条件.使用两个指针p和q,一个指针先走k-1步,然后第二个指针开始走.当第一个指针指向单链表的最后一个节点时,第二个指针指向倒数第k个节点.代码如下: 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 }

《剑指Offer》题目:链表中倒数第k个结点

题目描述:输入一个链表,输出该链表中倒数第k个结点 题目分析:因为不能直接从链表的尾部遍历,所以要分两步走: 第一步:从链表的头部开始遍历,直至链表的尾部,统计出链表结点的个数 第二步:根据链表结点的个数,计算出倒数第k个结点的位置(从头部看的位置),即n-k+1个结点,输出该结点. Java代码: class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public clas

剑指offer【13】- 链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点. 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode FindKthToTail(ListNode head,int k) { 12 13 if(head == null){ 14

【剑指Offer】14、链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 题解一:栈 1 public static ListNode FindKthToTail(ListNode head,int k) { 2 if(head==null||k<=0){ 3 return null; 4 } 5 Stack<ListNode> stack = new Stack<>(); 6 while (head!=null){ 7 stack.push(head); 8 head=head.next; 9

剑指 14. 代码的鲁棒性 链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 本人渣渣思路:要求解链表中的倒数第k个结点,可以采用栈先进后出的特点,倒数第k个进栈的话,出栈的时候就是第k个出栈的了 那么一开始就遍历链表,然后将每个结点进栈,在将栈的第k个结点出栈即可 import java.util.Stack;/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public c

《剑指offer》第二十二题(链表中倒数第k个结点)

// 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, // 从头结点开始它们的值依次是1.2.3.4.5.6.这个链表的倒数第3个结点是 // 值为4的结点. //O(n)的解法:维护两个指针,让A走B前头,前K步,A到头,B就是解了,但是这个问题在于程序鲁棒性 #include <iostream> #include "List.h&q

《剑指offer》第二十二题:链表中倒数第k个结点

// 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, // 从头结点开始它们的值依次是1.2.3.4.5.6.这个链表的倒数第3个结点是 // 值为4的结点. #include <cstdio> #include "List.h" ListNode* FindKthToTail(ListNode* pListHead, unsi

【Java】 剑指offer(22) 链表中倒数第k个结点

正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始它们的值依次是1.2.3.4.5.6.这个链表的倒数第3个结点是值为4的结点. 思路 第一直觉是先从头开始遍历,计算链表个数n,然后重新遍历,第n-k+1个结点即为所需要的结点.但是需要遍历2次.后面采用了栈进行实现该

剑指Offer面试题15(Java版):链表中倒数第K个结点

题目: 输入一个链表,输出该链表中倒数第k哥结点. 为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点. 例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点 为了得到第K个结点,很自然的想法是先走到链表的尾端,再从尾端回溯K步.可是我们从链表结点的定义可疑看出本题中的链表 是单向链表,单向链表的结点只有从前往后的指针而没有从后往前的指针,因此这种思路行不通. 既然不能从尾节点开始遍历这个链表,我们还是把思路回到头