剑指offer第2版22题:链表中倒数第k个结点

小渣渣的算法学习笔记:2018秋招备战


数据结构类算法总结:链表


1.题目描述:

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

2.代码实现:

public class Solution22 {
    private static class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }

    public static void main(String[] args) {
        ListNode l1 = new ListNode(5);
        ListNode l2 = new ListNode(3);
        ListNode l3 = new ListNode(2);
        ListNode l4 = new ListNode(6);
        ListNode l5 = new ListNode(8);
        ListNode l6 = new ListNode(9);
        l1.next = l2;
        l2.next = l3;
        l3.next = l4;
        l4.next = l5;
        l5.next = l6;
        Solution22 s = new Solution22();
        int k = 5;
        ListNode l = s.FindKthToTail(l1,k);
        if(l != null){
            System.out.println(String.format("链表中倒数第%d个结点值为%d",k,l.val));
        }else{
            System.out.println(String.format("链表中倒数第%d个结点不存在",k));
        }

    }

    public ListNode FindKthToTail(ListNode head,int k){
        //如果头结点为空或者链表没有第k个结点
        if(head == null || k == 0) return null;
        //两个指针遍历链表,让其中一个速度快些
        ListNode ahead = head;
        ListNode behead = null;
        //如果结点总数小于k,返回空
        for(int i = 0;i < k-1;++i){
            if(ahead.next != null){
                ahead = ahead.next;
            }else{
                return null;
            }
        }

        behead = head;
        while(ahead.next != null){
            ahead = ahead.next;
            behead = behead.next;
        }
        return behead;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42561115/article/details/80945473