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日

相关文章

  • NDK 数据结构之队列与栈等的实现

    NDK 数据结构之队列与栈等的实现 引言 Android NDK 是 Android 开发工具包的一部分,可以用 C 和 C++ 编写应用程序和库。NDK 带来了许多好处,例如可以针对不同的平台进行优化,可以通过调用底层 C/C++ 库实现更高效的算法等。 在本篇文档中,我们将探讨如何使用 NDK 实现一些基础的数据结构,包括队列、栈等等。 队列的实现 队列…

    数据结构 2023年5月17日
    00
  • C语言数据结构之堆排序的优化算法

    C语言数据结构之堆排序的优化算法攻略 堆排序简介 堆排序(HeapSort)是一种树形选择排序,在排序过程中始终保持一个最大堆,每次将堆顶元素与最后一个元素交换位置,并进行一次最大堆调整操作,直到整个序列有序为止。 堆排序的时间复杂度为O(nlogn),具有不需额外存储空间的特点,因此广泛应用于内存受限的场景。 堆排序的优化算法 1. 建堆操作的优化 将序列…

    数据结构 2023年5月17日
    00
  • 「学习笔记」数位 DP

    「学习笔记」数位 DP 意义不大的题不写了。 点击查看目录 目录 「学习笔记」数位 DP 概述 例题 P2657 [SCOI2009] windy 数 思路 代码 P4317 花神的数论题 思路 P4124 [CQOI2016]手机号码 思路 代码 haha数 题意 思路 代码 0和1的熟练 题意 思路 代码 苍与红的试炼 题意 思路 代码 概述 数位 DP…

    算法与数据结构 2023年4月17日
    00
  • 详解Java中字典树(Trie树)的图解与实现

    详解Java中字典树(Trie树)的图解与实现 一、什么是字典树(Trie树) 字典树,又称为Trie树,是一种树形数据结构。常用于统计和排序大量的字符串。它支持快速插入和查找,并且可以用于词频统计。 二、字典树的基本性质 根节点不包含字符,除根节点外每个节点都只包含一个字符。 从根节点到某个节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的…

    数据结构 2023年5月17日
    00
  • LCA——ST表+欧拉序

    了解到一个quan新的东西: 用ST表(欧拉序)实现LCA(树上最近公共祖先) 欧拉序 前序遍历得到的序列,叫dfs序但数字可以重复出现,一进一出,叫欧拉序会发现根结点总在中间而根结点是该段序列深度最小的点因此两个点的LCA,就是在该序列上两个点第一次出现的区间内深度最小的那个点 即转化为区间RMQ问题,可以用ST表当然你可以再写一棵线段树(如果有修改操作)…

    算法与数据结构 2023年5月4日
    00
  • JavaScript中数据结构与算法(四):串(BF)

    JavaScript中数据结构与算法(四):串(BF) 一、串的定义 在计算机科学中,串(string)是由零个或多个字符组成的有限序列。零个字符的串称为空串(empty string),也叫做空格串(null string)。串中的字符数称为串的长度(length)。 二、串BF算法的定义 串的BF算法,也称为朴素算法(Brute-Force Algori…

    数据结构 2023年5月17日
    00
  • MySQL优化及索引解析

    MySQL是业界常用的关系型数据库管理系统之一,作为程序员,我们需要了解如何对MySQL进行优化,以提高数据库的性能。下面是MySQL优化及索引解析的完整攻略。 目录 优化查询语句 优化数据库设计 优化服务器架构 索引优化 实例分析 优化查询语句 查询语句是应用程序与数据库之间的桥梁,优化查询语句可以大大提高数据库的性能。以下是一些优化查询语句的方法: 使用…

    数据结构 2023年5月17日
    00
  • C语言数据结构算法基础之循环队列示例

    标题:C语言数据结构算法基础之循环队列示例 1. 简介 循环队列是一种常见的数据结构,它采用固定大小的数组来模拟队列的数据结构,可以高效地处理队列的进出操作。本文将会讲解循环队列的实现原理和示例代码。 2. 循环队列基本原理 循环队列通过两个指针front和rear来实现队列的添加和删除操作。在初始化时,front和rear的初始值都为0。每当数据进入队列时…

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