面试题 02.01. 移除重复节点
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:
链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。
进阶:
如果不得使用临时缓冲区,该怎么解决?
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-duplicate-node-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
头尾指针法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
//头尾指针法
HashSet<Integer> map = new HashSet<>();
ListNode pre = null, cur = head;
while(cur!=null){
//如果存在,则改变尾连接达到删除节点目的
if(map.contains(cur.val)){
pre.next = cur.next;
}
//如果不存在,则添加数值进set中
else{
map.add(cur.val);
pre = cur;
}
cur = cur.next;
}
return head;
}
}
递归方法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
//递归方法
HashSet<Integer> set = new HashSet<>();
//排除特殊情况
if(head==null) return head;
set.add(head.val);
removeNodes(head,set);
return head;
}
public void removeNodes(ListNode head,HashSet set){
if(head.next==null)return;
if(set.contains(head.next.val)){
head.next = head.next.next;
//递归下去找到没有重复的数字
removeNodes(head,set);
}else{
//添加下一节点set中没有的数字
set.add(head.next.val);
removeNodes(head.next,set);
}
}
}