【练习Day9】

1.编程题:删除有序链表中的重复元素

链接:删除有序链表中重复的元素-I_牛客题霸_牛客网

方法:遍历删除(推荐使用)

思路:

既然连续相同的元素只留下一个,我们留下哪一个最好呢?当然是遇到的第一个元素了!

java 复制代码
if(cur.val == cur.next.val) 
    cur.next = cur.next.next;

因为第一个元素直接就与前面的链表节点连接好了,前面就不用管了,只需要跳过后面重复的元素,连接第一个不重复的元素就可以了,在链表中连接后面的元素总比连接前面的元素更方便嘛,因为不能逆序访问。

具体做法:

  • step 1:判断链表是否为空链表,空链表不处理直接返回。
  • step 2:使用一个指针遍历链表,如果指针当前节点与下一个节点的值相同,我们就跳过下一个节点,当前节点直接连接下个节点的后一位。
  • step 3:如果当前节点与下一个节点值不同,继续往后遍历。
  • step 4:循环过程中每次用到了两个节点值,要检查连续两个节点是否为空。
java 复制代码
import java.util.*;
public class Solution {
    public ListNode deleteDuplicates (ListNode head) {
        //空链表
        if(head == null) 
            return null;
        //遍历指针
        ListNode cur = head; 
        //指针当前和下一位不为空
        while(cur != null && cur.next != null){ 
            //如果当前与下一位相等则忽略下一位
            if(cur.val == cur.next.val) 
                cur.next = cur.next.next;
            //否则指针正常遍历
            else 
                cur = cur.next;
        }
        return head;
    }
}

复杂度分析:

  • 时间复杂度:O(n),其中n为链表长度,遍历一次链表
  • 空间复杂度:O(1),常数级指针变量使用,没有使用额外的辅助空间

2.平均查找长度

根据散列函数 H(k) = kmod 7 计算每个关键字的散列地址:

32 mod 7 = 4

24 mod 7 = 3

15 mod 7 = 1

27 mod 7 = 6

20 mod 7 = 6(冲突)

13 mod 7 = 6(冲突)

然后,使用链地址法解决冲突,构建散列表如下:

地址0:

地址1:15

地址2:

地址3:24

地址4:32

地址5:

地址6:27 -> 20 -> 13

计算平均查找长度:

对于32,查找长度为1

对于24,查找长度为1

对于15,查找长度为1

对于27,查找长度为1

对于20,查找长度为2

对于13,查找长度为3

平均查找长度 ASL=(1 + 1+1+1+2+3)/6 = 1.5

答案:A

3.链表特点

链表的特点:

链表在插入和删除元素时,只需要改变节点间的指针,不需要移动元素。

链表不能随机访问任一元素,因为链表中的元素是通过指针依次连接的,要访问某个元素需要从表头开始依次遍历。

链表不需要事先估计存储空间,因为链表是动态分配内存的,需要存储一个元素时就分配一个节点的空间。

链表所需空间与线性长度成正比,因为每个节点都需要额外的指针空间。

链表不具有的特点是可随机访问任一元素。

答案:B

4.判断链表为空的条件

带头结点的单链表的特点:

带头结点的单链表中,头结点是一个额外的节点,它不存储实际的数据,只是为了操作方便。

当单链表为空时,头结点的`next`指针应该指向`NULL`。因为头结点存在,但是没有后续的数据节点。

题目问对于头指针为`head`的带头结点的单链表,判断该表为空的条件是什么。 判断条件是`head->next == NULL`。

答案:B

5.删除结点的后续结点

单链表中删除节点的操作:

要删除`p`所指节点的后继节点,需要让`p`的`next`指针指向`p`的后继节点的后继节点。

假设`p`指向当前节点,`p->next`指向要删除的后继节点,`p->next->next`指向后继节点的后继节点。

那么删除`p`所指节点的后继节点的操作就是`p->next = p->next->next`。

题目问在一个单链表中,若删除`p`所指节点的后继节点,则执行什么操作。根据上述分析,正确的操作是`p->next = p->next->next`。

答案:C

相关推荐
古法老登瞎折腾14 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
智能运维指南15 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
yz_aiks16 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵16 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设16 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都16 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
鱼宵16 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作
白山编程大哥17 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Linux运维技术栈17 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
On The Road :17 小时前
Java 多线程详解:从入门到线程安全
java·python·安全