完整代码示例-Java实现找出单链表的倒数第K个结点

废话不多说,直接上代码:

package DataStrcture.ArrayDemo.singlelistdemo;

public class GetLastNode {
    //内部结点类
    public static class Node{
        Node next;
        int num;
        ///构造器, tostring()
        public Node(int num){
            this.num = num;
        }

        @Override
        public String toString() {
            return "Node{num=" + num +
                    '}';
        }
    }

///头结点
    Node head = new Node(0);
    ///得到结点的长度
    public int getLength(){
        //临时变量
        Node temp = head;
        int count=0;

        if(temp.next == null)
            return 0;
        while(true){
            if(temp.next == null)
                break;
            temp = temp.next;
            count++;
        }
        return count;
    }

    ///得到倒数第k个节点
    /*
    思路: 首先, 单链表只能顺序访问
    2. 要得到倒数第k个链表, 我们需要知道链表的长度length
    3. 然后很简单, 直接访问 第length-k个结点(那就是妥妥的倒数第k个结点)就可以了呀
     */

    public Node getLastIndexNode(int index){
        ///临时结点搞起来
        Node temp = head.next; ///head是无用结点, 所以我们从直接把临时变量temp指向首元结点
        int count =0;
        // 链表长度
        int length = getLength();
		
		///对 index做一个校验
		if( index <=0 || index > length) {
			System.out.println("输入的位置索引不规范!")
			return null;
		}
			
        ///判空
        if( length == 0 || temp.next == null){
            System.out.println("链表为空");
            return null;
        }

        //访问第 size - k个结点, 即是倒数第k个结点
        while(true){

            temp = temp.next;
            count++;
            if(count == (length-index)) ///我们的temp初始位置是head结点, count需要多
                break;
        }
        return temp;
    }

    ///结点加入链表
    public void add(Node node){
        Node temp = head;

        while(true){
            if(temp.next == null)
                break;
            temp = temp.next;
        }
        temp.next = node;
    }

    public static void main(String[] args) {
        //链表
        GetLastNode gln = new GetLastNode();
        //结点
        Node node_1 = new Node(6);
        Node node_2 = new Node(1);
        Node node_3 = new Node(7);
        Node node_4 = new Node(2);
        Node node_5 = new Node(9);
        Node node_6 = new Node(5);

        ///结点加入链表
        gln.add(node_1);
        gln.add(node_2);
        gln.add(node_3);
        gln.add(node_4);
        gln.add(node_5);
        gln.add(node_6);




        // 链表的长度为
        System.out.println("链表的长度为: "+gln.getLength());

        ///链表的倒数第三个结点的数据为:
        System.out.println("链表的倒数第三个结点的数据为:"+gln.getLastIndexNode(3));
    }

}

运行结果:

在这里插入图片描述

posted @ 2022-05-26 20:31  青松城  阅读(27)  评论(0编辑  收藏  举报