查找单链表中的倒数第k个结点

有头结点且头结点不存放数据的链表

思路:倒数第k个节点的位置 = 链表总长度size-k

public static void main(String[] args) {

    // 初始化链表
    Node node1 = new Node(1);
    Node node2 = new Node(2);
    Node node3 = new Node(3);
    Node node4 = new Node(4);

    SingleLinkedList singleLinkedList = new SingleLinkedList();
    singleLinkedList.add(node1);
    singleLinkedList.add(node2);
    singleLinkedList.add(node3);
    singleLinkedList.add(node4);
    
    // 查看链表
    singleLinkedList.list();
    
    // 查找单链表中的倒数第k个结点
    Node kNode = findLastIndexNode(singleLinkedList, 1);
    System.out.println(kNode);
}

/**
 * 查找单链表中的倒数第k个结点
 * @param singleLinkedList 要进行查找的单向链表
 * @param k 传入倒数第几位
 * @return 该位置的节点
 * 在main 方法调用,所以定义为static
 */
public static Node findLastIndexNode(SingleLinkedList singleLinkedList, int k) {

    Node head = singleLinkedList.getHead();
    if(head.next == null){
        return null;
    }
    //1. 获得链表的长度(总个数)
    int size = singleLinkedList.getLength(head);
    //2. k不能为负数以及大于总长度
    if(k <= 0 || k > size){
        return null;
    }

    //3. 定义给辅助变量
    Node cur = head.next;
    //4. 遍历 倒数第K个节点[size-K]的位置
    while (size-k != 0){
        cur = cur.next;
        size--;
    }
    return cur;
}
/**
 * 单向链表:这里定义的单链表是拥有头节点的,且头节点不放数据
 */
public class SingleLinkedList {

    //1. 初始化一个头节点,头节点不存放具体数据
    private Node head = new Node(0);

    //2. 返回头节点
    public Node getHead(){
        return head;
    }

    //3. 添加节点
    public void add(Node heroNode) {
        //因为head节点是不能动的,动了的话链表就找不到入口或者找错路口,所以需要一个辅助节点遍历
        Node temp = head;
        while (true){
            if (temp.next == null) {
                temp.next = heroNode;
                break;
            }
            temp = temp.next;
        }
    }

    //4. 显示链表[遍历]
    public void list(){
        if(head.next == null){
            System.out.println("链表为空");
            return;
        }

        Node temp = head.next;
        while (true){
            if(temp == null){
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }

}
/**
 * 链表结点定义
 */
public class Node {

    public int val;
    //指向下一个节点
    public Node next;

    //构造器
    public Node(int no){
        this.val = no;
    }

    @Override
    public String toString() {
        return "HeroNode[no=" + val + "]";
    }

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值