数据结构与算法Java篇

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

2018-10-14  本文已影响0人  NetCedar

问题描述
       只进行一次遍历,找到链表中倒数第k个结点
解法思路
      定义2个指针,先让第一个指针走k-1步,第二个指针才开始走,当第一个指针指向链表尾部的时候,第一个指针就指向倒数第k个节点

public class FindKthToTail {
    /**
     * 创建listNode节点
     */
    private static class ListNode{
       int val;
       ListNode next=null;

        public ListNode() {
        }

        public  ListNode(int val) {
            this.val = val;
        }
    }
    public FindKthToTail() {
    }
        /**
         *
         * @param head
         * @param k
         * @return
         * 找到输入一个链表,输出该链表中倒数第k个结点
         * 链表只遍历一次
         */
        public static ListNode FindKthToTail(ListNode head, int k) {
            //鲁棒性考虑
            if (head==null||k==0){  //输入空的情况
                return null;
            }
            //定义两个指针
            ListNode first=head;
            ListNode second=head;
            //先让第一个指针走k-1次
            for (int i=0;i<k-1;i++){
                if(first.next!=null){
                    first=first.next;
                    System.out.println("firsrt:"+first.val);
                }else {
                    return null; //如果输入的k值太大,比如求倒数第五个节点 链表长度为4
                }
            }
            while (first.next!=null){
                //然后两个指针同时后走,当第一个指针走到尾的时候,第二个指针刚好就再k上面
                first=first.next;
                second=second.next;
            }
            System.out.println("result:"+second.val);
            return second;
        }

    public static void main(String[] args) {
        ListNode node=new ListNode(1);
        node.next=new ListNode(2);
        node.next.next=new ListNode(3);
        node.next.next.next=new ListNode(4);
        node.next.next.next.next=new ListNode(5);
        node.next.next.next.next.next=new ListNode(6);
        ListNode r=FindKthToTail(node,5);

    }
}
上一篇下一篇

猜你喜欢

热点阅读