Java数据结构之单链表的实现与面试题汇总

Java数据结构之单链表的实现与面试题汇总

一、前言

单链表是数据结构中最基础的数据结构之一,也是在面试时经常会考察的一个知识点。本文将详细介绍单链表的实现过程,并对常见的单链表面试题进行总结,帮助大家深入了解单链表的原理和应用。

二、单链表的实现

单链表是由一些列节点构成的,每个节点包括一个数据和一个指向下一个节点的指针。下面我们将实现一个简单的单链表,并提供对应的操作方法,包括:

  1. 添加节点;
  2. 删除节点;
  3. 插入节点;
  4. 遍历节点;
  5. 查找节点。

1. 定义节点类

节点类的作用是定义节点的数据和指向下一个节点的指针,我们来看实现:

public class ListNode {
    // 存放数据
    int val;
    // 指向下一个节点的指针
    ListNode next;

    // 构造函数
    public ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

2. 定义单链表类

在单链表类中,我们需要将每个节点连接起来,并提供对应的操作方法:

public class LinkedList {
    // 头节点
    ListNode head;

    // 构造函数
    public LinkedList() {
        this.head = null;
    }

    // 添加节点
    public void addNode(int val) {
        ListNode newNode = new ListNode(val);
        if (head == null) {
            head = newNode;
        } else {
            ListNode curr = head;
            while (curr.next != null) {
                curr = curr.next;
            }
            curr.next = newNode;
        }
    }

    // 删除节点
    public void deleteNode(int val) {
        if (head == null) {
            return;
        }
        if (head.val == val) {
            head = head.next;
        } else {
            ListNode prev = head;
            ListNode curr = head.next;
            while (curr != null && curr.val != val) {
                prev = curr;
                curr = curr.next;
            }
            if (curr != null && curr.val == val) {
                prev.next = curr.next;
            }
        }
    }

    // 插入节点
    public void insertNode(int val, int index) {
        if (index < 0) {
            return;
        }
        if (index == 0 || head == null) {
            addNode(val);
        } else {
            ListNode newNode = new ListNode(val);
            int count = 0;
            ListNode curr = head;
            ListNode prev = null;
            while (curr != null && count < index) {
                prev = curr;
                curr = curr.next;
                count++;
            }
            prev.next = newNode;
            newNode.next = curr;
        }
    }

    // 遍历节点
    public void traverseNode() {
        ListNode curr = head;
        while (curr != null) {
            System.out.print(curr.val + " ");
            curr = curr.next;
        }
        System.out.println();
    }

    // 查找节点
    public ListNode searchNode(int val) {
        ListNode curr = head;
        while (curr != null && curr.val != val) {
            curr = curr.next;
        }
        return curr;
    }
}

3. 单链表使用样例

public class Main {
    public static void main(String[] args) {
        LinkedList list = new LinkedList();

        // 添加节点
        list.addNode(1);
        list.addNode(2);
        list.addNode(3);
        list.addNode(4);

        // 删除节点
        list.deleteNode(4);

        // 插入节点
        list.insertNode(5, 2);

        // 遍历节点
        list.traverseNode();

        // 查找节点
        System.out.println(list.searchNode(5).val);
    }
}

三、面试题汇总

1. 链表反转

题目描述:将一个链表进行反转,例如输入[1, 2, 3, 4]反转后输出为[4, 3, 2, 1]。

解题思路:使用三个指针逐个反转链表。具体看代码:

public ListNode reverseList(ListNode head) {
    if (head == null) {
        return null;
    }
    ListNode prev = null;
    ListNode curr = head;
    ListNode next = null;
    while (curr != null) {
        next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}

2. 链表中环的检测

题目描述:给定一个链表,判断链表中是否存在环。

解题思路:如果链表中存在环,那么两个指针迭代时将一直重合。

public boolean hasCycle(ListNode head) {
    if (head == null) {
        return false;
    }
    ListNode slow = head;
    ListNode fast = head.next;
    while (fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
        if (slow == fast) {
            return true;
        }
    }
    return false;
}

四、总结

本篇文章对Java数据结构之单链表的实现进行了详细的介绍,并提供对应的操作方法。同时,针对常见的单链表面试题也进行了总结,希望能对大家在学习和面试中有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之单链表的实现与面试题汇总 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 解析网站处理数据交换时的序列化和反序列化

    当网站处理数据交换时,数据往往要以一定的格式进行序列化和反序列化,以保证数据的传输和存储的正确性。本文将详细讲解如何解析网站处理数据交换时的序列化和反序列化。 什么是序列化和反序列化? 序列化(Serialization),简单来说就是将数据从一种特定的格式转换成字符串的过程。因此经过序列化后的数据可以通过网络传输或者存储到文件中,同时也可以减少数据传输过程…

    数据结构 2023年5月17日
    00
  • Redis中5种数据结构的使用场景介绍

    下面是详细的攻略: Redis中5种数据结构的使用场景介绍 Redis是一个高性能的无类型的键值数据库,支持多种数据结构。在使用Redis时,了解各种数据结构的使用场景,可以帮助我们更好地使用Redis。 1. String String是Redis最基本的数据结构,可以存储字符串、整数和浮点数,最大长度为512MB。 使用场景: 存储单个值,如用户ID、用…

    数据结构 2023年5月17日
    00
  • C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 什么是栈? 栈(Stack)是一种线性数据结构,它具有“后进先出”(Last-In-First-Out)的特性。栈顶是栈的一端,另一端称为栈底。每次只能从栈顶插入数据(入栈)或者从栈顶取出数据(出栈)。 栈的简单操作 栈的简单操作包括: 初始化栈 判断栈是否为空 判断栈是否已满 入栈操作 出栈操作 获取栈顶元素 栈的初始化 栈的初…

    数据结构 2023年5月16日
    00
  • C语言树状数组的实例详解

    首先需要了解什么是树状数组。树状数组(Binary Indexed Tree,BIT),也叫做 Fenwick 树(树状数组的发明者是Peter M. Fenwick),是一个查询和修改复杂度都为 log(n) 的数据结构,与线段树类似,但使用起来比线段树更加方便以及简洁。 在该攻略中,我们将通过两条树状数组的实例,详细讲解树状数组,让读者更好地理解树状数组…

    数据结构 2023年5月17日
    00
  • C++数据结构哈希表详解

    C++数据结构哈希表详解 哈希表(Hash Table)是一种非常重要的数据结构,用于实现字典等各种应用。哈希表将关键字映射到一个固定大小的数据集合中,以支持常数时间复杂度的插入、查找和删除操作。哈希表的核心思想是将关键字通过哈希函数(Hash Function)映射到数据集合中的一个索引位置,哈希函数需要满足良好的散列性质,使得关键字能够均匀地散布在数据集…

    数据结构 2023年5月17日
    00
  • 手写 Vue3 响应式系统(核心就一个数据结构)

    下面是手写 Vue3 响应式系统的完整攻略。 1. 概述 Vue3 的响应式系统使用了 Proxy 对象来监测对象的变化,相较于 Vue2 的响应式系统使用 Object.defineProperty 进行数据劫持,Proxy 具有更好的性能和更简洁的 API。 当我们修改 Vue3 中的 reactive 对象内部的数据时,就会触发依赖收集和派发更新的操作…

    数据结构 2023年5月17日
    00
  • 基于python实现模拟数据结构模型

    实现一个模拟数据结构模型的过程需要考虑以下几个步骤: 确定数据结构类型,例如链表、栈、队列、二叉树等。 设计数据结构的具体实现方法,例如链表可采用节点、指针的方式实现,栈可以使用列表或数组实现,队列可使用循环队列实现等。 使用Python编写数据结构相关的类、方法、函数等,确保代码的可读性、灵活性和易维护性。 使用示例数据测试数据结构的各种操作,例如插入、删…

    数据结构 2023年5月17日
    00
  • Raft协议及伪码解析

    目录 节点的状态转换 follower candidate leader 伪码部分 节点初始化(Initialazation) 选举时其他节点的视角 回到candidate选举时的视角 消息如何广播复制 重要的反复出现的ReplicateLog 节点收到了LogRequest 节点如何追加log,Appendentries 再次回到leader, 如何处理L…

    算法与数据结构 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部