
1.思路两个指针分别指向cur.next和cur.next.next如果发现重复就一次性删除所有值为val的节点否则cur正常前进一位。2.复杂度分析1时间复杂度O(n)其中n为链表的长度。2空间复杂度O(1)仅用到若干额外变量。附代码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模式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; } }