• 「Java 数据结构」:手撕单链表的增删改查及大厂面试题。


    目录

    一、单链表的增删改查

    1、创建结点        ​

    2、单链表的添加操作

    3、单链表的删除操作

    4、单链表的有效结点的个数

    二、大厂面试题

    1、新浪微博:查找单链表中倒数第k个结点

    2、腾讯面试题:单链表的反转


    一、单链表的增删改查

    1、创建结点        

              

            单链表是由结点连接而成,所以我们首先要创建结点类,用于对结点进行操作。定义data属性 表示序号,定义name属性表示结点存放的数据信息,定义next属性表示指向下一个结点。构造器只需要放入data属性和name属性,重写toString方法方便打印结点信息。

    1. public class Node {
    2. public int data;
    3. public String name;
    4. public Node next;
    5. public Node(int data, String name){
    6. this.data = data;
    7. this.name = name;
    8. }
    9. @Override
    10. public String toString() {
    11. return "Node{" +
    12. "data=" + data +
    13. ", name='" + name + '\'' +
    14. '}';
    15. }
    16. }

    2、单链表的添加操作

    ▶ 首先创建头结点

            此结点表示链表的头,不存放实际数据的。

    private Node head = new Node(0,"");

    ▶ 添加操作

            将新的结点添加到链表的尾部,我们首先要遍历链表,找到链表的尾部,然后将最后一个结点的next指向新的结点,新结点的next指向NULL,这样就完成了链表的添加操作,这种每次添加到链表的尾部的操作称为尾插法。注意,当我们遍历链表时,需要一个辅助结点temp来进行遍历,因为head头结点不能动。

    1. public class SingleLinkedList {
    2. //首先创建头结点,此结点表示链表的头,无具体数据
    3. private Node head = new Node(0,"");
    4. //添加结点操作
    5. public void addData(Node node){
    6. Node temp = head;
    7. while (true){
    8. if (temp.next == null){
    9. temp.next = node;
    10. node.next = null;
    11. break;
    12. }
    13. temp = temp.next;
    14. }
    15. }
    16. }

    3、单链表的删除操作

            假设我们要删除中间这个结点,我们只需要将这个结点的上一个结点的next指向这个结点的下一个结点(也就是将第一个结点的next指向第三个结点)。

    1. public void delData(Node node){
    2. Node temp = head;
    3. while (true){
    4. //如果是要删除的结点
    5. if (temp.next.data == node.data){
    6. temp.next = temp.next.next;
    7. break;
    8. }else if(temp.next == null){
    9. System.out.println("未找到结点!");
    10. break;
    11. }
    12. temp = temp.next;
    13. }
    14. }

     4、单链表的有效结点的个数

            我们可以定义一个计数的变量count,初始化为0,然后循环遍历链表,每遍历到一个结点,count就加一,这样就能求出单链表的有效个数。

    1. public int countData(){
    2. Node temp = head.next;
    3. int count = 0;
    4. while (true){
    5. if (temp == null){
    6. break;
    7. }
    8. count++;
    9. temp = temp.next;
    10. }
    11. return count;
    12. }

    二、大厂面试题

     1、新浪微博:查找单链表中倒数第k个结点

             从上图可以看出,假设要找倒数第2个结点,我们该怎么做?不难看出,倒数第二个结点也是顺序的第三个结点,也就是将倒数的结点转换成顺序结点,遍历链表找到顺序结点即可。因为是有明确表示是第几个结点,所以我们需要知道结点的有效个数,前面我们介绍了有效个数的求法,直接用即可。当我们要找倒数第k个结点,我们可以转换成顺序的第(count - k + 1)个结点。比如:k = 2,count = 4, 倒数第2个结点也就是顺序第(4 - 2 + 1 = 3)个结点。

    1. public Node referNode(int n){
    2. //根据前面计算有效个数的方法,求得链表总结点个数
    3. int max = countData();
    4. //计数
    5. int count = 1;
    6. //判断指定的结点是否在范围内
    7. if (!(n >= 1 && n <= max)){
    8. throw new RuntimeException("没有此结点!");
    9. }
    10. //辅助结点
    11. Node temp = head.next;
    12. //循环遍历查找
    13. while (true){
    14. //满足条件,则是我们要找的结点
    15. if (count == (max - n + 1)){
    16. return temp;
    17. }else {
    18. temp = temp.next;
    19. count++;
    20. }
    21. }
    22. }

    2、腾讯面试题:单链表的反转

             首先创建辅助变量temp用于循环原来的链表,辅助变量temp1记录temp的下一个位置,每遍历到一个结点就插入到新链表的头部,这种方式称为头插法。

    1. public void nodeReversal(Node head){
    2. //如果链表为空或链表只有一个结点,则不需要反转
    3. if (head.next == null || head.next.next == null){
    4. return;
    5. }
    6. //辅助变量temp
    7. Node temp = head.next;
    8. //辅助变量temp1
    9. Node temp1 = null;
    10. //循环遍历
    11. while (true){
    12. //退出循环的条件
    13. if (temp == null){
    14. break;
    15. }
    16. //首先将temp的下一个结点给temp1
    17. temp1 = temp.next;
    18. //然后将temp的next指向新链表头headReversal的next(头指向的下一个)
    19. temp.next = headReversal.next;
    20. //再然后将新链表头headReversal的next指向temp结点
    21. headReversal.next = temp;
    22. //最后将temp1记录的结点赋值给temp
    23. temp = temp1;
    24. }
    25. //遍历结束,将新的顺序替换原来的顺序
    26. head.next = headReversal.next;
    27. //显示链表,这个方法需要自己写
    28. showList(head);
    29. }

  • 相关阅读:
    【日常记录】CTF审查清单(windows)
    大疆Livox MID-360安装ROS1/2驱动 Ubuntu20.04
    umi4+vue3开发模板摸索
    gRpc_go_dart-1.编写第一个服务
    docker 应用部署
    【AI视野·今日NLP 自然语言处理论文速览 第四十一期】Tue, 26 Sep 2023
    2022亚太数学杯数学建模竞赛B题(思路、程序......)
    RTT学习笔记10- 设备IPC 完成量-ringbufffer-workwueue
    React Hooks useReducer 使用详解+实现原理+源码分析
    openGauss+KeepAlived(故障转移)
  • 原文地址:https://blog.csdn.net/yzh2776680982/article/details/125828628