题干
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:
链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。
进阶:
如果不得使用临时缓冲区,该怎么解决?
想法
没排序的去重且不改变原本顺序
显然可以使用hashset帮助去重
重复就越过这个节点
不重复就到下一个 且加入set
注意链表是单向的即可
Java代码
package daily;
import java.util.HashSet;
import java.util.Set;
public class RemoveDuplicateNodes {
public static class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public ListNode removeDuplicateNodes(ListNode head) {
if(head==null){
return null;
}
Set<Integer> set=new HashSet<>();
ListNode node=head;
set.add(node.val);
while(node.next!=null){
//没重复
if(set.add(node.next.val)){
node=node.next;
}
//重复就越过
else {
node.next=node.next.next;
}
}
node.next=null;
return head;
}
public static void main(String[] args){
RemoveDuplicateNodes removeDuplicateNodes=new RemoveDuplicateNodes();
//[1, 2, 3, 3, 2, 1]
int [] val={1, 2, 3, 3, 2, 1};
ListNode head=new ListNode(1);
ListNode node=head;
for (int i=1;i<val.length;i++){
node.next=new ListNode(val[i]);
node=node.next;
}
ListNode res=removeDuplicateNodes.removeDuplicateNodes(head);
while (res.next!=null){
System.out.println(res.val);
res=res.next;
}
System.out.println(res.val);
}
}