Java单链表的增删改查与面试题详解

Java单链表的增删改查与面试题详解

概述

Java单链表是一种常用的数据结构,具有插入、删除、查找等基本操作。本文将为大家详细讲解Java单链表的增删改查操作以及相关面试题。

单链表的定义

单链表是一种线性表,采用链式存储结构,通过指针来实现元素之间的关联。单链表由一系列的结点(Node)组成,每个结点包含两部分:数据域和指针域。数据域存储结点的值,指针域存储下一个结点的地址。

单链表的基本操作

插入操作

单链表插入操作有两种方式:头插法和尾插法。头插法将新结点插入到链表头部,尾插法将新结点插入到链表尾部。

头插法示例

public void addFirst(int val) {
    Node newNode = new Node(val, null);
    newNode.next = head.next;
    head.next = newNode;
}

在上面的示例中,我们创建了一个新结点,并将新结点插入到链表头部。首先,我们将新结点的next指针指向原链表的头结点,接着将原链表的头结点指向新结点。

尾插法示例

public void addLast(int val) {
    Node newNode = new Node(val, null);
    if (head.next == null) {
        head.next = newNode;
    } else {
        Node tail = head.next;
        while (tail.next != null) {
            tail = tail.next;
        }
        tail.next = newNode;
    }
}

在上面的示例中,我们创建了一个新结点,并将新结点插入到链表尾部。首先,我们需要遍历整个链表,找到最后一个结点(即next指针为null的结点),然后将最后一个结点的next指针指向新结点。

删除操作

单链表删除操作需要知道要删除的结点的前一个结点。删除操作即将前一个结点的next指针指向要删除结点的下一个结点即可。

public void deleteNode(int val) {
    Node prev = head;
    while (prev.next != null) {
        if (prev.next.val == val) {
            prev.next = prev.next.next;
            return;
        }
        prev = prev.next;
    }
}

在上面的示例中,我们遍历整个链表,找到要删除的结点的前一个结点,然后修改前一个结点的next指针即可。

修改操作

单链表修改操作需要知道要修改的结点的位置。遍历链表找到要修改的结点,然后修改该结点的值即可。

public void updateNode(int pos, int val) {
    Node p = head.next;
    int i = 0;
    while (p != null && i < pos) {
        p = p.next;
        i++;
    }
    if (p != null) {
        p.val = val;
    }
}

在上面的示例中,我们遍历链表找到要修改的结点,然后修改该结点的值即可。

查找操作

单链表查找操作需要知道要查找的值或者其所在的位置。遍历链表找到要查找的结点,然后返回该结点的值或者该结点的位置即可。

public int getVal(int pos) {
    Node p = head.next;
    int i = 0;
    while (p != null && i < pos) {
        p = p.next;
        i++;
    }
    if (p != null) {
        return p.val;
    }
    return -1;
}

public int getPos(int val) {
    Node p = head.next;
    int pos = 0;
    while (p != null && p.val != val) {
        p = p.next;
        pos++;
    }
    if (p != null) {
        return pos;
    }
    return -1;
}

在上面的示例中,我们遍历链表找到要查找的结点,然后返回该结点的值或者该结点的位置即可。

面试题详解

面试题1

如何将一个单链表按照奇偶数分别排列?

解答:可以采用双指针法,创建两个指针分别指向奇数位置和偶数位置的结点,然后将奇数位置的结点插入到一个新链表中,偶数位置的结点插入到另一个新链表中,最后将两个新链表连接起来即可。

面试题2

如何删除一个单链表中的重复结点?

解答:可以采用哈希表来记录每个结点是否出现过,遍历链表的同时判断当前结点是否出现过,若出现过则将前一个结点的next指针指向当前结点的下一个结点即可,时间复杂度为O(n)。

总结

本文介绍了Java单链表的增删改查操作和相关的面试题,希望本文能够帮助大家更好地掌握单链表的基本操作和应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java单链表的增删改查与面试题详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 如何将C语言代码转换为应用程序(也就是编译)

    将C语言代码转换为应用程序的过程,是通过编译器将源代码翻译并转化为二进制文件的过程。 以下是将C语言代码转换为应用程序的完整攻略: 安装编译器:首先需要先安装C语言的编译器,常用的编译器有gcc、clang等。以gcc为例,在Linux系统下执行以下命令安装gcc: sudo apt-get install gcc 编写C语言代码:在电脑上编写C语言代码,需…

    other 2023年6月25日
    00
  • Mysql字符串字段判断是否包含某个字符串的2种方法

    下面我会详细讲解一下Mysql字符串字段判断是否包含某个字符串的2种常用方法。 方法一:使用LIKE关键字 在SELECT语句中使用LIKE关键字,判断某个字符串是否在目标字段中出现。 语法:SELECT * FROM table_name WHERE column_name LIKE ‘%string%’ 其中%表示通配符,%string%就表示在colu…

    other 2023年6月25日
    00
  • css3实现超过两行文字,超出用三个点显示(兼容性不行,仅供…

    CSS3 实现超过两行文字,超出用三个点显示的完整攻略 在网页设计中,经常会遇到需要限制文本长度的情况,特别是在一些列表、卡片等组件中,需要限制文本长度并用省略号代替。本文将为您提供一份 CSS3 实现超过两行文字,超出用三个点显示的完整攻略,包括使用 text-overflow 属性和 line-clamp 属性两种方法,同时提供两个示例说明。 使用 te…

    other 2023年5月5日
    00
  • PHP const定义常量及global定义全局常量实例解析

    PHP const定义常量及global定义全局常量实例解析 在PHP中,我们可以使用const关键字来定义常量,也可以使用global关键字来定义全局常量。本攻略将详细讲解这两种方式,并提供两个示例说明。 使用const定义常量 使用const关键字可以在PHP中定义常量。常量一旦定义,其值在脚本的执行过程中是不可改变的。 语法 const CONSTAN…

    other 2023年7月29日
    00
  • nodeserver零基础——开发环境文件自动重载

    nodeserver零基础——开发环境文件自动重载 在软件开发中,不断地修改代码,并且反复测试是一个必不可少的过程。然而,对于初学者来说,这一过程会变得很繁琐。每一次修改代码后,需要手动重启服务器,才能看到修改后的效果,这对于时间的浪费是不必要的。因此,为了方便初学者,现在我们来介绍一种零基础操作的方法,将我们的开发环境改进为支持自动重载的环境。 什么是文件…

    其他 2023年3月28日
    00
  • 如何在不同的设备上使用苹果照片流功能

    当你打开苹果的照片应用程序时,你会在底部的选项中看到一个名为“照片流”的标签。点击该标签,你可以轻松创建一个名为“我的照片流”的流,并开始分享相册。照片流是一种免费的图片分享服务,可以让你与你的朋友、家人和同事分享你拍摄的照片。照片流功能可以在不同的设备上使用,下面是详细的攻略。 在iOS设备上使用照片流 打开“照片”应用程序,并点击底部的“照片流”选项卡。…

    other 2023年6月27日
    00
  • vs提示无法连接到已配置的开发web服务器的解决方法

    以下是“VS提示无法连接到已配置的开发web服务器的解决方法”的完整攻略: 什么是“VS提示无法连接到已配置的开发web服务器”? 当使用Visual Studio进行Web开发时,时会遇到“无法连接到已配置的开发Web服务器”的错误提示。这通常是由于配置错误或网络问题导致的。 步骤1:检查Web服务器配置 首先,检查Web服务器配置是否正确。确保已正确配置…

    other 2023年5月6日
    00
  • 详解JavaScript什么情况下不建议使用箭头函数

    下面是详解“详解JavaScript什么情况下不建议使用箭头函数”的攻略。 为什么会使用箭头函数 在JavaScript中,箭头函数是ES6引入的一种语法糖,相较于传统的函数声明方式,更加简洁明了。下面是一个简单的例子: // 传统的函数声明方式 function sum(a, b) { return a + b; } // 使用箭头函数的方式 const …

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部