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

package com.fjf.test;


import com.fjf.test.Test15.ListNode;


/**
 * 
 * @author fjf
 * 2018年8月19日 22:46:11
 *输入一个链表,输出该链表中倒数第k个结点。
 */
public class Test14 {


    public static void main(String[] args) {
        Mylink l = new Mylink();
        for (int i = 0; i < 10; i++) {
            l.addLink(i);
        }
        l.print(l.head);

        System.out.println("------------");

        int K = 10;
        Solution s = new Solution();
       ListNode K_node = s.FindKthToTail(l.head, K);

        System.out.println("输出倒数第"+K+"个节点,其值为:"+K_node.val);

    }

    /**
     * 
     * @author fjf
     * p q 两个节点。p先走K-1,然后带q一起走。相当于拉一把尺子。当P走到最后时,尺子的另一端q正好走到K。
     *
     */
    static class Solution{
        ListNode FindKthToTail(ListNode head,int k) {

             if(head==null){
                 return null;
             }

             ListNode p ,q ;
             p = q = head;
             int i = 0;   //i作为一个计步器,计量尺子拉了多长
             for (i=0;p !=null; i++) {
                if(i>=k){     //i没到达K之前,q一直不走
                    q = q.next;
                }
                p = p.next;
            }
              return i<k?null:q;
            }
    }



     //定义链表
     static class Mylink{
         public ListNode head;
         public ListNode current;

         public void addLink(int data){
             if(head==null){
                 head = new ListNode(data);
                 current = head;
             }else{
                 current.next = new ListNode(data);
                 current = current.next;
             }
         }

         public void print(ListNode head){
                if(head == null){
                    return;
                }

                current = head;
                while(current!=null){
                    System.out.println(current.val);
                    current = current.next;
                }
            }  
     }


     //定义节点
     static class ListNode{
         int val;
         ListNode next =null;
         ListNode(int val) {
                this.val = val;
            }
     }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值