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

相关推荐
许小燚1 小时前
线性表——双向链表
数据结构·链表
界面开发小八哥1 小时前
「Java EE开发指南」如何用MyEclipse创建一个WEB项目?(三)
java·ide·java-ee·myeclipse
idolyXyz2 小时前
[java: Cleaner]-一文述之
java
一碗谦谦粉2 小时前
Maven 依赖调解的两大原则
java·maven
netyeaxi3 小时前
Java:使用spring-boot + mybatis如何打印SQL日志?
java·spring·mybatis
收破烂的小熊猫~3 小时前
《Java修仙传:从凡胎到码帝》第四章:设计模式破万法
java·开发语言·设计模式
猴哥源码3 小时前
基于Java+SpringBoot的动物领养平台
java·spring boot
老任与码3 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
小兵张健3 小时前
武汉拿下 23k offer 经历
java·面试·ai编程
FreeBuf_3 小时前
Apache组件遭大规模攻击:Tomcat与Camel高危RCE漏洞引发数千次利用尝试
java·tomcat·apache