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

相关推荐
要加油哦~3 分钟前
vue · 插槽 | $slots:访问所有命名插槽内容 | 插槽的使用:子组件和父组件如何书写?
java·前端·javascript
crud6 分钟前
Spring Boot 3 整合 Swagger:打造现代化 API 文档系统(附完整代码 + 高级配置 + 最佳实践)
java·spring boot·swagger
天天摸鱼的java工程师11 分钟前
从被测试小姐姐追着怼到运维小哥点赞:我在项目管理系统的 MySQL 优化实战
java·后端·mysql
周某某~22 分钟前
四.抽象工厂模式
java·设计模式·抽象工厂模式
慢半拍iii30 分钟前
数据结构——F/图
c语言·开发语言·数据结构·c++
异常君1 小时前
高并发数据写入场景下 MySQL 的性能瓶颈与替代方案
java·mysql·性能优化
烙印6011 小时前
MyBatis原理剖析(二)
java·数据库·mybatis
你是狒狒吗1 小时前
TM中,return new TransactionManagerImpl(raf, fc);为什么返回是new了一个新的实例
java·开发语言·数据库
iceslime1 小时前
旅行商问题(TSP)的 C++ 动态规划解法教学攻略
数据结构·c++·算法·算法设计与分析
勤奋的知更鸟1 小时前
Java编程之组合模式
java·开发语言·设计模式·组合模式