删除排序链表中的重复元素Ⅱ(指针+空链表实现)

tech2026-06-10  1

题目

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。

示例 : 输入: 1->1->1->2->3 输出: 2->3

注意点

1、因为链表为有序的,所以我们只需要判断一个数字出现的次数即可; 2、该题主要使用空链表+指针实现:

空链表:记录不重复的节点;指针:主要用来判断一个数字出现的次数。(左指针(left)表示数字开始的位置,右指针(right)表示数字结束的位置,默认left = right,表示只出现1次(不存在重复数字))

3、思路

遍历整个排序链表,判断相邻两个数字是否重复,如果重复,则右指针后移,直到不出现重复数字为止;(获取该数字的结束位置)如果left = right(不存在重复数字),则将该节点插入到结果链表中(尾插法),否则,不操作;重复以上步骤。

4、最后记得清空结果链表中尾端可能附带的其他节点。(因为将节点插入到结果链表中不只插入一个元素,而是以left为开始的链表)

实现

public ListNode deleteDuplicates(ListNode head) { //初始化结果链表的头节点 ListNode result = new ListNode(-1); //初始化头节点指针 ListNode cur = result; //遍历排序链表 while (head != null){ ListNode left = head; //左指针 ListNode right = head; //右指针 //如果排序链表中相邻的两个节点的值相等 while (head.next != null && head.val == head.next.val){ //右指针后移 right = right.next; //遍历指针后移 head = head.next; } //如果没有重复的元素 if (left == right){ //将节点插入到结果链表中 cur.next = left; //指针后移 cur = cur.next; } //遍历指针后移 head = head.next; } //清除结果链表中可以附加的节点 cur.next = null; //返回结果 return result.next; }
最新回复(0)