查找单链表的倒数第k个节点(java代码实现)

单链表节点定义

/**
 * className:LNode
 *
 * @author:zjl
 * @version:0.1
 * @date:2020/7/1520:22
 * @since:jdk1.8
 */
public class LNode {

    private Object data;
    private LNode next;

    public LNode() {
        this.data=null;
        this.next=null;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public LNode getNext() {
        return next;
    }

    public void setNext(LNode next) {
        this.next = next;
    }

}

单链表定义(带头结点)

/**
 * className:LinkList
 *
 * @author:zjl
 * @version:0.1
 * @date:2020/7/1520:26
 * @since:jdk1.8
 */
public class LinkList {

    private LNode p;

    public LinkList() {
        this.p = new LNode();
    }

    public LNode getP() {
        return p;
    }

    public void setP(LNode p) {
        this.p = p;
    }
}

实现方法类

/**
 * className:Find
 *
 * @author:zjl
 * @version:0.1
 * @date:2020/7/1520:25
 * @since:jdk1.8
 */
public class Find {
    /**
     * 查找链表中倒数第k个节点
     * @param linkList
     * @param k
     * @return
     */
    public LNode findBackK(LinkList linkList,int k) {
        LNode p = linkList.getP();
        LNode q = p;
        int count = 1;
        while (q.getNext() != null) {//统计链表中共有多少节点,避免k过大出现异常
            q = q.getNext();
            count++;
        }
        if(k<1)
            throw new RuntimeException("k需要大于等于1");
        if (count < k) {
            throw new RuntimeException("链表中共" + count + "个节点(包括头结点),无法找到倒数第" + k+"个节点");
        }
        q=p;//q指针回到头结点
        for (int i = 1; i < k; i++) {//q指针向后移动k-1次
            q = q.getNext();
        }
        while (q.getNext()!=null){//p,q同时向后移动,当q指向尾结点时候p刚好指向倒数第k个节点
            q=q.getNext();
            p=p.getNext();
        }
        return p;
    }

    /**
     * 控制台输出链表
     * @param linkList
     */
    public void show(LinkList linkList){
        LNode p = linkList.getP();
        System.out.print("头结点");
        while (p.getNext()!=null){
            p=p.getNext();
            System.out.print("->"+p.getData());
        }
    }
}

测试类

/**
 * className:Test
 *
 * @author:zjl
 * @version:0.1
 * @date:2020/7/1520:39
 * @since:jdk1.8
 */
public class Test {

    public static void main(String[] args) {
        //新建一个11个节点的单链表(包含头结点)
        LinkList list = new LinkList();
        LNode t = list.getP();
        for (int i = 0; i < 10; i++) {
            LNode node = new LNode();
            node.setData(i);
            t.setNext(node);
            t=t.getNext();
        }

        Find find = new Find();
        //输出新建链表
        System.out.println("=================链表================");
        find.show(list);
        System.out.println("\n====================================");
        //获取倒数第6第8个节点
        LNode nb6 = find.findBackK(list, 6);
        LNode nb8 = find.findBackK(list, 8);
        System.out.println("倒数第6个节点data域:"+nb6.getData());
        System.out.println("倒数第8个节点data域:"+nb8.getData());
        System.out.println("=====================================");
    }

}

控制台结测试结果

查找单链表的倒数第k个节点(java代码实现)_第1张图片

你可能感兴趣的:(数据结构,算法,java,单链表,链表,数据结构)