ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-25 20:00:59  阅读:122  来源: 互联网

标签:Node 结点 head 倒数第 链表 singleLinkedList 表中 next public


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

思路:倒数第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();

    Node kNode = findLastIndexNode(singleLinkedList, 1);
    System.out.println(kNode);
}

/**
 * 查找单链表中的倒数第k个结点
 * @param singleLinkedList 要进行查找的单向链表
 * @param k 传入倒数第几位
 * @return 该位置的节点
 */
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的校验,明显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 Node {

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

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

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

}
/**
 * 单向链表
 * 说明:这里定义的单链表是拥有头节点的,且头节点不放数据
 */
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;
        }
    }

}

标签:Node,结点,head,倒数第,链表,singleLinkedList,表中,next,public
来源: https://blog.csdn.net/qq_33732195/article/details/120476534

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有