02.01. 移除重复节点
简单
提示
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:
- 链表长度在[0, 20000]范围内。
- 链表元素在[0, 20000]范围内。
进阶:
如果不得使用临时缓冲区,该怎么解决?
尝试一:HashSet
/**27.05%
HashSet:
使用set累加判断是否重复
*/
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
ListNode index = head;
//set用于累加判断是否重复
Set<Integer> set = new HashSet();
while(index != null && index.next != null){
set.add(index.val);
//重复则删除index.next
if(set.contains(index.next.val)){
index.next = index.next.next;
}
else{
index = index.next;
}
}
return head;
}
}
尝试二:双指针
/**8.22%
双指针:
1.遍历链表使用left指针
2.left用于遍历每个元素,起始值为head起始元素
3.right指针用于对比遍历left右边的所有元素,起始位置从left开始
4.遍历时left指针对应right.next的元素值对比是否相同
5.相同则right.next = right.next.next
6.直到right.next.next = null,执行完就停止
*/
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
ListNode left = head;
while(left != null){
ListNode right = left;
//注意:right.next != null一定要加上否则right.next.val会空指针
while(right != null && right.next != null){
//重复元素直接利用链接下下个元素删除当前重复元素
if(left.val == right.next.val){
//删除下一个重复的元素之后,再重新遍历比较一次,否则会有遗漏例如:1,1,1,1,2变成1,1,2
right.next = right.next.next;
}else{
right = right.next;
}
}
left = left.next;
}
return head;
}
}