题目:
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:
链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。
思路+代码
刚开始想的是创建一个新的链表,之后通过哈希数组存已经有的节点值,把不重复的添加的新链表中,最后返回新链表。
后来发现可以直接在原链表上操作。用两个指针,前后一起遍历,还是要用哈希数组记录一下已经有的节点值,如果再遇到相同的值,就把前面节点的next指针指到再下一个节点。
代码:
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
if(head==null){
return head;
}
//一前一后两个指针
ListNode p,q;
p = head;
q = p.next;
//哈希数组
int[] arr = new int[20001];
//把前面指针的值存到哈希数组里面(刚开始忽略了这一步)
arr[p.val]++;
//循环遍历
while(q!=null){
if(arr[q.val]>0){ //重复出现
p.next=q.next;
}else{ //首次出现
arr[q.val]++;
p=q;
}
q=q.next;
}
return head;
}
}
结果:
应该还可以。