本文共 1167 字,大约阅读时间需要 3 分钟。
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
步骤详解
要在排序链表中删除所有重复的元素,可以使用两个指针的方法,具体步骤如下:
初始化指针:将两个指针l和r分别指向链表的首节点和次节点。 遍历链表:从链表的第二个节点开始,用指针r遍历整个链表。 比较节点值:如果r节点的值大于l节点的值,则将l指针跳转到r节点位置,并将r指针继续移动到下一个节点。 处理重复节点:当r遍历完所有节点后,检查l节点后面的节点。如果有并且相等,则将l节点后面节点设置为null,确保最后一个节点不与前面重复。 返回结果:返回处理后的链表。 代码实现
class Solution { public ListNode deleteDuplicates(ListNode head) { if (head == null) { return head; } ListNode l = head; ListNode r = head.next; while (r != null) { if (r.val > l.val) { l.next = r; l = r; } r = r.next; } if (l.next != null && l.val == l.next.val) { l.next = null; } return head; }}
功能测试
测试一下该算法是否正常工作。
测试用例1
- 输入:1 -> 1 -> 2
- 预期输出:1 -> 2
代码运行过程:
- l = 第一个1,r移动到第二个1(val=1)。由于r.val <= l.val,r移动到2(val=2)。
- 2 > 1,l.next = 2,l移动到2。r移动到null。
- 循环结束后,检查l.next为null,因此结果正确。
测试用例2
- 输入:1 -> 1 -> 2 -> 3 -> 3
- 预期输出:1 -> 2 -> 3
代码运行过程:
- l = 1,r = 1(val=1)。r.val <= l.val,r移动到2。
- 2 > 1,l.next = 2,l移动到2。r移动到3。
- 3 > 2,l.next = 3,l移动到3。r移动到3。
- 3 <= 3,无法进入if语句,r移动到null。
- 循环结束后,检查l.next为3,可能等于l的值(3 == 3),因此将其设为null,得到1 -> 2 -> 3。
通过这些测试,算法正确处理了所有情况。
转载地址:http://pejmz.baihongyu.com/