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

一、题目描述

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

二、题目分析

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

import java.util.*;
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        //是空的话返回Null
        if( head == null ) return null;
        Stack<ListNode> stack = new Stack<ListNode>();
        ListNode first = head;
        //将头结点放进来
        stack.push(first);
        //把剩下的结点放进来
        while( first != null ){
            first = first.next;
            stack.push(first);
        }
        //如果k大于了stack的长度,放回null
        if( k >= stack.size() ) return null;
        //将倒数的k-1个pop出去
        for( int i = 0;i < k;i++ ){
            stack.pop();
        }
        //返回倒数第k的元素
        return stack.pop();
    }
}

运行结果:
这里写图片描述

三、一个比较巧妙的方法

两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(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;
    }
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41835916/article/details/80675560