题号:no10
题目名:移除重复结点
原题URL:https://leetcode-cn.com/problems/remove-duplicate-node-lcci/
题目描述
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例
示例 1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例 2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
限制
- 链表长度在[0, 20000]范围内。
- 链表元素在[0, 20000]范围内。
进阶
- 如果不得使用临时缓冲区,该怎么解决?
思路
1.做一个hash表记录出现的数,出现过的话变成true
2.如果再次出现,直接删除当前节点
3.遍历的时候建立一个虚拟头结点dummy比较方便
解题代码
public class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
boolean[] isDuplicated = new boolean[20000];//设置标记
ListNode dummy = new ListNode(0);//虚拟头结点
dummy.next = head;
ListNode curr = head;
ListNode pre = dummy;
while (curr!=null) {
//如果不是重复的
if(!isDuplicated[curr.val]) {
isDuplicated[curr.val]=true;
pre=pre.next;
curr=pre.next;
}
else {
pre.next=curr.next;
curr=pre.next;
}
}
return head;
}
}