面试算法2

存在一个单链表,寻找这个单链表倒数第K的元素。比如{1->2->3->4->5},倒数第2个元素为4。

分析一
最容易想到的是:我们自己先遍历一遍链表,获取链表的总长度为N,那么我们就知道倒数第K的元素位置就是N-K。然后重新遍历该链表,寻找N-K位置的元素就可以了。

package com.brickworkers;

/**
 * 
 * @author Brickworker
 * Date:2017年6月28日下午2:25:55 
 * 关于类Example.java的描述:在单链表中寻找倒数第K个元素
 * Copyright (c) 2017, brcikworker All Rights Reserved.
 */
public class Example {

    //定义一个头节点
    Node head = null;

    //定义一个内部类,表示一个链表的节点
    class Node{
        private T t;
        Node next;
        public Node(T t) {
            this.t = t;
        }
    }

    //链表插入数据
    public void insert(T t){
        Node node = new Node(t);
        //如果头结点是空,那就是首次插入
        if(head == null){
            head = node;
        }else {
            //如果头结点不为空,那么寻找最后为空的位置插入
            Node p = head;
            while(p.next!= null){
                p = p.next;
            }
            p.next = node;
        }

    }

    //展示链表状态
    public void print(){
        Node p = head;
        while(p!=null){
            System.out.print(p.t + "->");
            p = p.next;
        }
        System.out.print("null\n");
    }


    //打印倒数第K个元素
    //分析一
    public void analysis1(int K){
    if(K < 1){
            throw new IllegalArgumentException("K参数不合法");
        }
        //先遍历一次链表获得总长度
       int count =0;
      Node p = head;
        while(p!=null){
            p = p.next;
            count++;
           }
        //再遍历一遍链表获得对于的值
    
          count = count-k;
          p=head;
          while(count>0){
          p=p.next;
          count--;
        }
        }
        System.out.println("倒数第" + K +"个元素为:" + p.t);

    } 

    public static void main(String[] args) {
        //构建一个链表
        Example example = new Example();
        example.insert(1);
        example.insert(2);
        example.insert(3);
        example.insert(4);
        example.insert(5);
        //打印链表结构
        example.print();
        //获取倒数第三个元素
        example.analysis1(3);
    }

}
//
//1->2->3->4->5->null
//倒数第3个元素为:3

你可能感兴趣的:(面试算法2)