【练习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

相关推荐
David爱编程4 分钟前
深入 Java synchronized 底层:字节码解析与 MonitorEnter 原理全揭秘
java·后端
索迪迈科技8 分钟前
Protobuf 新版“调试表示为什么有链接?为什么会打码?我该怎么改代码?
java·log4j·apache
胡耀超14 分钟前
3.Python高级数据结构与文本处理
服务器·数据结构·人工智能·windows·python·大模型
云:鸢15 分钟前
C语言链表设计及应用
c语言·开发语言·数据结构·链表
a_blue_ice17 分钟前
JAVA 面试 MySQL
java·mysql·面试
月阳羊1 小时前
【硬件-笔试面试题-76】硬件/电子工程师,笔试面试题(知识点:H桥驱动电路的设计要点)
java·单片机·嵌入式硬件·面试·职场和发展
赵星星5201 小时前
MySQL的默认隔离级别:为什么是可重复读(RR)而非读已提交(RC)?
java
用户2018792831671 小时前
故事:公司的 "私人储物柜" 系统(ThreadLocalMap)
android·java
ling__i1 小时前
java day18
java·开发语言
非ban必选1 小时前
netty-scoket.io路径配置
java·服务器·前端