原题: 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]范围内。
进阶:
如果不得使用临时缓冲区,该怎么解决?
二、解题
方法一: 使用hashset
package com.leetcode.test.linklist;
import java.util.HashSet;
/**
* 编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
*/
public class Solution8 {
public static void main(String[] args) {
ListNode a1 = new ListNode(1);
ListNode a2 = new ListNode(2);
ListNode a3 = new ListNode(3);
ListNode a4 = new ListNode(3);
ListNode a5 = new ListNode(2);
ListNode a6 = new ListNode(1);
a1.next = a2;
a2.next = a3;
a3.next = a4;
a4.next = a5;
a5.next = a6;
ListNode l = removeDuplicateNodes(a1);
while (l != null) {
System.out.print(l.val + " ");
l = l.next;
}
}
public static ListNode removeDuplicateNodes(ListNode head) {
if (head == null) {
return null;
}
ListNode cur = head;
HashSet<Integer> hashSet = new HashSet<>();
hashSet.add(head.val); //刚开始就把头结点数据放进去
while (cur.next != null){
int nextVal = cur.next.val;
if (hashSet.contains(nextVal)){
cur.next = cur.next.next;
} else {
cur = cur.next;
hashSet.add(cur.val);
}
}
return head;
}
}
三、运行结果
四、提交结果
方法一结果: