LeetCode CodeTop 82.删除排序链表中的重复元素Ⅱ

1.思路:两个指针分别指向cur.next和cur.next.next,如果发现重复就一次性删除所有值为val的节点;否则cur正常前进一位。

2.复杂度分析:

(1)时间复杂度:O(n),其中n为链表的长度。

(2)空间复杂度:O(1),仅用到若干额外变量。

附代码:

java 复制代码
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode sentinel = new ListNode();
        sentinel.next = head;
        ListNode cur = sentinel;
        while(cur.next != null && cur.next.next != null){
            int val = cur.next.val;
            // 后两个节点值相同,都为val
            if(val == cur.next.next.val){
                // 从第一个值等于val的节点开始,将值等于val的节点全部删除
                while(cur.next != null && cur.next.val == val){
                    cur.next = cur.next.next;
                }
            }else{
                cur = cur.next;
            }
        }
        return sentinel.next;
    }
}

ACM模式:

java 复制代码
import java.util.Scanner;

// 将 ListNode 定义为独立的类
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取链表长度
        int n = scanner.nextInt();

        // 读取链表元素
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = scanner.nextInt();
        }

        // 创建链表
        ListNode head = null;
        if (n > 0) {
            head = new ListNode(nums[0]);
            ListNode current = head;
            for (int i = 1; i < n; i++) {
                current.next = new ListNode(nums[i]);
                current = current.next;
            }
        }

        // 调用删除重复元素方法
        Solution solution = new Solution();
        ListNode result = solution.deleteDuplicates(head);

        // 输出删除重复后的链表
        if (result == null) {
            System.out.println("");
        } else {
            ListNode current = result;
            while (current != null) {
                System.out.print(current.val);
                if (current.next != null) {
                    System.out.print(" ");
                }
                current = current.next;
            }
            System.out.println();
        }

        scanner.close();
    }
}

// 删除重复元素方法放在 Solution 类中
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode sentinel = new ListNode();
        sentinel.next = head;
        ListNode cur = sentinel;
        while (cur.next != null && cur.next.next != null) {
            int val = cur.next.val;
            // 后两个节点值相同,都为val
            if (val == cur.next.next.val) {
                // 从第一个值等于val的节点开始,将值等于val的节点全部删除
                while (cur.next != null && cur.next.val == val) {
                    cur.next = cur.next.next;
                }
            } else {
                cur = cur.next;
            }
        }
        return sentinel.next;
    }
}
相关推荐
189228048611 小时前
NV114固态MT29F16T08EWLEHD6-MES:E
人工智能·算法·缓存·性能优化
不会就选b1 小时前
数据结构之链表OJ题(下)
数据结构·链表
Tairitsu_H1 小时前
[LC优选算法#4] 滑动窗口 | 串联所有单词的⼦串 | 最⼩覆盖⼦串
c++·算法·滑动窗口
devilnumber1 小时前
Java 二分查找(二分算法)详解 + 实战运用 + 核心坑点
java·开发语言·算法
洛水水1 小时前
【力扣100题】84.字符串解码
算法·leetcode·职场和发展
MicroTech20252 小时前
量子隐形传态路线的瓶颈与突破,微算法科技(MLGO)以技术创新助力量子通信长距离组网
科技·算法·量子计算
洛水水2 小时前
【力扣100题】89.下一个排列
数据结构·算法·leetcode
洛水水2 小时前
【力扣100题】90.寻找重复数
算法·leetcode·职场和发展
鱼子星_2 小时前
【数据结构】排序的拓展——快速排序的生态多样性与归并排序沾染文件操作
c语言·数据结构·算法