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日

相关文章

  • 关于ubuntu系统忘记密码的解决方法合集

    关于Ubuntu系统忘记密码的解决方法合集 Ubuntu是一款流行的Linux操作系统。然而,有时候用户可能会忘记Ubuntu系统的密码,这将导致您无法登录到系统。但是,不要担心,我们为您提供了以下解决方法,以帮助您重置Ubuntu系统密码。 方法一:使用GRUB菜单 在启动系统时,按住SHIFT键来打开GRUB菜单。 选择Ubuntu操作系统,并按下E键来…

    其他 2023年3月29日
    00
  • 关于r:使用mutate功能时遇到麻烦

    以下是关于“关于R:使用mutate功能时遇到麻烦”的完整攻略,包含两个示例。 背景 在R语言中,我们可以使用mutate()函数来创建新的变量或修改现有变量。然而,在使用mutate()函数时,我们可能会遇到一些麻烦,例如无法正确地创建新的变量或修改现有变量。那么,在R语言中,我们应该如何使用mutate()函数来创建新的变量或修改现有变量呢? 方法一:使…

    other 2023年5月9日
    00
  • EditText限制输入数字,精确到小数点后1位的设置方法

    当你想要限制用户在EditText中输入数字,并且要求精确到小数点后一位时,你可以按照以下步骤进行设置: 首先,在你的布局文件中,添加一个EditText组件: <EditText android:id=\"@+id/editText\" android:layout_width=\"match_parent\"…

    other 2023年9月5日
    00
  • GTA5 PC版ScriptHook无法加载怎么办 ScriptHook无法加载解决方法

    我会提供详细的攻略来解决这个问题。 GTA5 PC版ScriptHook无法加载怎么办 什么是ScriptHook? ScriptHook是一个GTA游戏的扩展模块,可用于PC版GTA5中。该扩展模块使得玩家可以使用额外的外部脚本来改变游戏中的各个方面,例如增加自定义车辆、人物或者场景等。 为什么ScriptHook无法加载? 当ScriptHook无法加载…

    other 2023年6月27日
    00
  • Spring中bean的生命周期之getSingleton方法

    让我们来详细讲解一下“Spring中bean的生命周期之getSingleton方法”这个问题。 什么是Bean的生命周期 在Spring中,Bean的生命周期分为以下阶段: 实例化:Spring容器创建一个Bean的实例 属性注入:Spring容器将配置文件或注解中的属性注入到Bean中 初始化:Spring容器初始化Bean 使用:Bean在容器中被使用…

    other 2023年6月27日
    00
  • 谈谈我对Spring Bean 生命周期的理解

    下面是关于Spring Bean生命周期的详细讲解。 Spring Bean 生命周期 Spring Bean生命周期指的是从Bean实例化开始,到销毁的整个过程。下面列出了Spring Bean生命周期的主要步骤: 实例化Bean:使用Java实例化Spring Bean。 设置Bean的属性值:调用setter方法或通过构造函数传递Spring Bean…

    other 2023年6月20日
    00
  • Java面向对象程序设计多态性示例

    Java的面向对象编程具有多态性,可以通过对父类的引用调用子类的方法。以下是讲解Java面向对象程序设计多态性示例的完整攻略。 1. 理解多态性 在面向对象编程中,多态性可以指同一个实体可以被不同方式解释的能力,多态性的实现方式通常是通过继承、方法重载和重写等方式。在Java中,我们经常会用到继承和方法重写,这两种特性可以实现多态性。 2. 示例一:动态绑定…

    other 2023年6月26日
    00
  • Ceph集群CephFS文件存储核心概念及部署使用详解

    Ceph集群CephFS文件存储核心概念及部署使用详解 什么是CephFS? CephFS是Ceph存储集群中的分布式文件系统模块,它为用户提供了一种类似于NFS、SMB等传统文件系统协议的文件访问方法,并可以将数据分散存储在Ceph集群中的多个节点上,从而实现高可用性、高效性等功能。 CephFS主要由以下几个核心组件组成: Metadata Server…

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