链表-删除链表中重复的结点-JZ56

该博客讨论了如何删除排序链表中重复的结点,通过遍历链表并检查相邻节点值是否相等来实现。当遇到重复结点时,会跳过连续的相同结点,直至找到不同值的结点。最后返回的新链表中不再包含重复的结点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
示例1

输入: {1,2,3,3,4,4,5}
返回值: {1,2,5}

思路
在遍历单链表的时候,检查当前节点与下一点是否为相同值,如果相同,继续查找祥同值的最大长度

代码:

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        if (pHead == null || pHead.next == null) {
            //链表节点少于两个的必定没有重复结点
            return pHead;
        }
        ListNode vHead = new ListNode(-1);
        ListNode pre = vHead;//新链表尾结点 
        ListNode cur = pHead;//当前要遍历的结点
        while(cur != null) {
            if (cur.next != null && cur.val == cur.next.val) {
                //需要跳过重复结点
                ListNode temp = cur.next;
                while(temp.next != null && temp.val == temp.next.val) {
                    temp = temp.next;
                }
                cur = temp.next;
            } else {
                pre.next = new ListNode(cur.val);
                cur = cur.next;
                pre = pre.next;
            }
        }
        return vHead.next;
    }
}
### 使用汇编语言实现学生成绩管理系统的概述 汇编语言是一种低级编程语言,能够直接操作计算机硬件资源。对于开发学生成绩管理系统而言,在汇编语言中主要涉及数据结构的设计、输入/输出处理以及基本算法的实现。 #### 数据存储设计 为了有效地管理和查询学生信息,可以采用线性表来保存学生的成绩记录。每个节点包含三个部分:学号、姓名和分数。由于汇编语言不支持高级抽象的数据类型定义,因此需要通过内存地址偏移量手动维护这些字段的位置关系[^1]。 ```assembly section .data ; 定义单个学生的信息长度为8字节(假设学号占4字节, 姓名指针占4字节), 成绩单独存放在另一个区域. student_info_size equ 8 ; 链接列表头指针初始化为空(null) head dd 0 tail dd 0 ``` #### 功能模块划分 ##### 添加新纪录 当新增一条学生成绩时,程序会分配一段连续的空间用于存放该条目,并将其链接到已有的链表末端。这里需要注意的是,因为汇编不具备自动垃圾回收机制,所以开发者要特别小心地管理动态申请的记忆体空间以防泄漏。 ```assembly ; 参数传递方式: EAX=学号 EBX=指向名字字符串 ECX=分数 add_student: push ebp mov ebp, esp sub esp, student_info_size ; 为新的学生信息预留空间 mov dword [esp], eax ; 存入学号 mov dword [esp+4], ebx ; 设置名称指针位置 lea eax, [esp] cmp dword [head], 0 ; 判断是否为首元素插入 je add_first_element not_adding_first: mov edx, [tail] mov [edx + 4], eax ; 更新前一结点next域 adding_tail: mov [tail], eax ; 将当前作为尾巴 jmp finish_addition add_first_element: mov [head], eax ; 如果是第一个则设置头部也为它 finish_addition: leave ret ``` ##### 查询功能 提供按条件查找特定的学生信息的功能,比如根据学号快速定位某位同学的成绩详情。这通常涉及到遍历整个链表直到找到匹配项为止。 ```assembly find_by_id proc id_to_find:dword xor ecx, ecx ; 清零计数器ECX准备循环使用 lookup_loop_start: mov eax, [head] check_next_node: test eax,eax ; 测试EAX是否已经到达NULL终止符 jz not_found_exit ; 若遇到结束标志则表示未发现目标对象 compare_ids: cmp dword ptr[eax],id_to_find ; 对比当前节点ID与给定参数 je found_match ; 发现相同即刻跳出并返回结果 move_forward: inc ecx ; 访问下一个节点之前增加索引 mov eax,dword ptr[eax+4] ; 获取下一项地址继续迭代过程 jmp lookup_loop_start ; 返回顶部重复执行直至成功或失败 found_match: mov eax,ecx ; 把命中次数回传出去供调用者解析具体位置 ret ; 正常退出流程携带有效负载 not_found_exit: dec eax ; 设定错误码(-1)代表未能检索到任何符合条件的结果 ret ; 结束子程序运行状态 endp find_by_id ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值