java-单链表实现输出倒数第k个节点

使用单链表,实现进行输出倒数第k个的节点
实现思路:
传入index值即为k值,
使用单链表的长度(不包含定义的空头节点的)size-index 为需要遍历的次数
使用辅助节点进行遍历,找到倒数的该节点

package com.it.likedList;

/**
 * @author Snail-Bo
 * @date 2020/3/27 13:48
 */
class SingleLinkedListDemo2 {
    public static void main(String[] args) {
        //测试
        UserNode2 user1 = new UserNode2(1, "小王", "1233");
        UserNode2 user2 = new UserNode2(2, "赵六", "2222");
        UserNode2 user3 = new UserNode2(3, "王五", "333");
        SingleLinkedList2 sing = new SingleLinkedList2();
        sing.add(user1);
        sing.add(user2);
        sing.add(user3);
        System.out.println("遍历链表");
        sing.list();
        System.out.println("链表的长度"+sing.getSize());
        System.out.println("输出的倒数的节点为:");
        System.out.println(sing.findlastIndexNode(4));

    }
}

class SingleLinkedList2{
     //初始化一个头节点 ,一般是定义不变的,不放具体的数据
    private UserNode2 head = new UserNode2(0,"","0");

    public UserNode2 getHead() {
        return head;
    }

    //添加用户节点
    public void add(UserNode2 userNode) {
        //头节点不能动,使用辅助的节点进行扫描,遍历
        System.out.println(userNode);
        UserNode2 temp = head;
        //遍历链表,找到最后面的那个节点,来进行添加节点
        while (temp.next != null) {
            temp = temp.next; //temp进行后移
        }
        temp.next = userNode; //将要新添加的节点,添加到最后的节点上

    }

    /**
     * 输出倒数第k个节点
     * @param index   为传入的 k 值
     * @return
     */
    public UserNode2 findlastIndexNode(int index){
        if(head.next==null){
            System.out.println("链表为空");
            return null;
        }
        UserNode2 cur = head.next;
        if(index<=0||index>getSize()){  //判断输入的位置是否正确
            System.out.println("没有此位置的节点");
            return null;
        }
        for (int i = 0; i < getSize()-index; i++) {  //得到有效的链表节点个数,在减去倒数的index数  遍历该次数,就得到了 对应的节点
            cur = cur.next;
        }
        return  cur;
    }
    /**
     * 得到有效链表节点的长度
     * @param
     * @return
     */
    public  int getSize(){
        int lenth = 0;
        if(head.next==null){
            System.out.println("链表为空");
            return lenth;
        }
        UserNode2 cur = head.next;
        while (cur!=null){
            lenth++;
            cur = cur.next;
        }
        return lenth;
    }

    //显示所有的链表(遍历)
    public void list(){
        //首先进行判断链表是否为空
        if (head.next==null){
            System.out.println("链表为空");
            return;
        }

        UserNode2 temp = head.next;
        //遍历head后面的节点 ,进行打印输出
        while (temp!=null){
            System.out.println(temp);
            temp = temp.next;   //将temp 进行后移
        }
    }

}


//定义用户的对象  即为每一个节点
class UserNode2{
    private int id;     //用户的编号
    private String name;    //用户的姓名
    private String num;   //用户的号码
    UserNode2 next; // 指向下一个用户

    //构造器
    public UserNode2(int id, String name, String num) {
        this.id = id;
        this.name = name;
        this.num = num;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public UserNode2 getNext() {
        return next;
    }

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

    @Override
    public String toString() {
        return "UserNode2{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", num='" + num + '\'' +
                ", next=" + next +
                '}';
    }
}

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