剑指Offer(十四)链表中倒数第k个结点(Java版 )

一、题目描述

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

二、题目分析

考虑到输出倒数第k个结点,“倒数”,想到了栈。

import java.util.*;
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if( head == null ) return null;  //是空的话返回Null
        Stack stack = new Stack();
        ListNode first = head;
        stack.push(first);     //将头结点放入栈中

        while( first != null ){     //把剩下的结点放进来
            first = first.next;
            stack.push(first);
        }
        if( k >= stack.size() ) return null;   //如果k大于了stack的长度,放回null
        for( int i = 0;i < k;i++ ){     //将倒数的k-1个pop出去
            stack.pop();
        }
        return stack.pop();    //返回倒数第k的元素
    }
}

运行结果:
剑指Offer(十四)链表中倒数第k个结点(Java版 )_第1张图片

三、一个比较巧妙的方法

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

import java.util.*;
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode p, q;
        p = q = head;
        int i = 0;
        for (; p != null; i++) {
            if (i >= k)
                q = q.next;
            p = p.next;
        }
        return i < k ? null : q;
    }
}

剑指Offer(十四)链表中倒数第k个结点(Java版 )_第2张图片


转载请标明出处,原文地址:https://blog.csdn.net/weixin_41835916 如果觉得本文对您有帮助,请点击支持一下,您的支持是我写作最大的动力,谢谢。

你可能感兴趣的:(剑指Offer(Java版),剑指Offer(干货版))