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日

相关文章

  • C语言数据结构之简易计算器

    C语言数据结构之简易计算器攻略 简介 这是一个基于C语言的简易计算器,可以实现加、减、乘、除四个基本运算。 实现步骤 首先,需要声明四个变量,分别表示运算符、被加数、被减数、被乘数和被除数。 char op; double n1, n2, result; 然后,需要通过scanf()函数获取用户输入的运算符和数字。 printf(“请输入运算符和数字:\n”…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构Number

    JavaScript数据结构Number 简介 JavaScript中的Number是一种表示数字的数据类型,包括整数和浮点数。Number类型的值是不可变的。 数字类型(Number)的创建 数字类型可以通过直接赋值的方式创建,如: let num = 10; // 整数 let floatNum = 3.14; // 浮点数 另外,JavaScript还…

    数据结构 2023年5月17日
    00
  • C数据结构中串简单实例

    下面我将为您详细讲解C语言中串的简单实例。 1. 什么是串 在C语言中,串(String)是由一系列字符组成的序列,是一种常见的数据类型。在C语言中,串通常是以字符数组(Char Array)的方式进行存储的。 2. 定义和初始化串 在C语言中,定义和初始化串可以通过以下方式进行: #include <stdio.h> #include <…

    数据结构 2023年5月17日
    00
  • 数据结构与算法之手撕排序算法

    数据结构与算法之手撕排序算法 本篇攻略介绍如何手撕常见的排序算法。 冒泡排序 冒泡排序是一种通过不断交换相邻元素来排序的方法。它的时间复杂度为$O(n^2)$。 def bubble_sort(nums): for i in range(len(nums)): for j in range(len(nums)-i-1): if nums[j] > nu…

    数据结构 2023年5月17日
    00
  • C语言实题讲解快速掌握单链表下

    C语言实题讲解快速掌握单链表下 简介 单链表是常见的一种数据结构,可以存储任意数量的数据,并且可以高效的进行插入、删除和查找操作。本篇文章将介绍如何使用C语言实现单链表,以及如何应对在实现单链表时所遇到的常见问题。 实现过程 数据结构设计 为了实现单链表,我们需要设计一个数据结构来存储节点信息,一般包含两个成员,一个是数据域,用来存储实际的数据,另一个是指针…

    数据结构 2023年5月17日
    00
  • 深入浅析C语言中堆栈和队列

    深入浅析C语言中堆栈和队列 堆栈(Stack) 堆栈是一种先进后出(Last In First Out,LIFO)的线性数据结构,只允许在一端进行插入和删除操作。堆栈在C语言中常用于函数调用时的参数传递、表达式求值和程序中断处理等场景。 实现堆栈的基本操作 下面是堆栈的基本操作,可以用数组来实现: 初始化 #define MAX_SIZE 100 // 假设…

    数据结构 2023年5月17日
    00
  • [paper reading]|IC-FPS: Instance-Centroid Faster Point Sampling Module for 3D Point-base

    摘要: 本文说首次实现了大规模点云场景中基于点的模型的实时检测(<30ms); 首先指出FPS采样策略进行下采样是耗时的,尤其当点云增加的时候,计算量和推理时间快速增加; 本文提出IC-FPS;包含两个模块:local feature diffusion based background point filter (LFDBF);Centroid In…

    算法与数据结构 2023年4月17日
    00
  • Java数据结构之实现跳表

    Java数据结构之实现跳表,是一篇对跳表数据结构的详细讲解。 背景 跳表是一种基于有序链表的高效查找算法,它的查找时间复杂度为O(logn),相比于普通链表的O(n),具有很大的优势。本文将介绍跳表的实现过程。 实现跳表 1. 跳表结构体 跳表的数据结构体实现包含以下四项: 头结点head:表示链表的起始位置。 节点Node:跳表中的节点,包含表层链表和下层…

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