算法通关村第一关---链表经典问题之删除排序链表中的重复元素 II 笔记

该文章是关于如何解决算法问题——从排序链表中删除所有重复的元素。方法包括创建虚拟头节点,遍历链表,检查连续节点值是否相等,如果相等则跳过这些节点,直至找到不同值的节点。此算法适用于LeetCode等编程挑战平台。
摘要由CSDN通过智能技术生成

算法通关村第一关—链表经典问题之删除排序链表中的重复元素 II 笔记

源码地址:GitHub-算法通关村

题目地址:LeetCode

image-20230721092028149

解题思路:

  1. 首先,检查输入的链表头节点是否为null,如果是空链表,则直接返回该头节点null。

  2. 创建一个虚拟头节点(dummyHead)。将虚拟头节点的next指针指向原链表的头节点head,以便处理链表开头的重复元素情况。

  3. 使用指针cur来代表当前遍历到的节点,开始时指向虚拟头节点dummyHead。

  4. 在遍历过程中,对于每个节点cur,检查其后继节点cur.next和后继节点的后继节点cur.next.next是否存在,即cur是否至少为链表中的倒数第二个节点。如果cur.next和cur.next.next都存在,继续执行下面的步骤,否则表示已经遍历到了链表倒数第二个节点或更短的链表,可以结束遍历。

  5. 检查当前节点cur的值cur.next.val和它的后继节点cur.next.next.val是否相等。如果相等,说明链表中存在重复元素。为了删除所有重复元素,需要进入一个循环,将指针cur的next指向不等于x的下一个节点,直到cur的next指向的节点值不等于x。这里的操作是:

    int x = cur.next.val;
    while (cur.next != null && cur.next.val == x) {
        cur.next = cur.next.next;
    }
    
  6. 如果当前节点cur的值cur.next.val和后继节点cur.next.next.val不相等,表示当前节点cur的后继节点cur.next是唯一的,不是重复元素,直接将指针cur移动到下一个节点,即 cur = cur.next;,继续遍历。

  7. 重复执行步骤4至步骤6,直到遍历到链表倒数第二个节点为止。

  8. 最后,返回虚拟头节点dummyHead的next指针所指向的链表头节点,即可得到删除所有重复元素的链表。

/**
     * 删除链表中的重复元素,全都不要
     *
     * @param head
     * @return
     */
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return head;
        }
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode cur = dummyHead;

        while (cur.next != null && cur.next.next != null) {
            if (cur.next.val == cur.next.next.val) {
                int x = cur.next.val;
                while (cur.next != null && cur.next.val == x) {
                    cur.next = cur.next.next;
                }
            } else {
                cur = cur.next;
            }
        }
        return dummyHead.next;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值