链接
思路
记录已经出现过的结点,添加未出现过的结点,三种方法都在代码里,并不难理解
代码
public ListNode removeDuplicateNodes(ListNode head)
{
//传入为空或只有一个结点,则返回head
if (head == null || head.next == null)
{
return head;
}
ListNode[] nodes = new ListNode[20001];
nodes[head.val] = head;
ListNode cur = head;
while (head.next != null)
{
ListNode temp = head.next;
//没有该元素
if (nodes[temp.val] == null)
{
nodes[temp.val] = temp;
head = head.next;
} else
{
head.next = head.next.next;
}
}
head.next = null;
return cur;
}
public ListNode removeDuplicateNodes2(ListNode head)
{
//传入为空或只有一个结点,则返回head
if (head == null || head.next == null)
{
return head;
}
ListNode[] nodes = new ListNode[20001];
nodes[head.val] = head;
ListNode cur = head.next;
ListNode prev = head;
while (cur != null)
{
//没有该元素
if (nodes[cur.val] == null)
{
nodes[cur.val] = cur;
prev.next = cur;
prev = prev.next;
}
cur = cur.next;
}
prev.next = null;
return head;
}
public ListNode removeDuplicateNodes1(ListNode head)
{
//传入为空或只有一个结点,则返回head
if (head == null || head.next == null)
{
return head;
}
Map<Integer, Integer> map = new HashMap<>();
map.put(head.val, 1);
ListNode cur = head.next;
ListNode prev = head;
while (cur != null)
{
//如果没有该数字则加入 map
if (!map.containsKey(cur.val))
{
map.put(cur.val, 1);
prev.next = cur;
prev = prev.next;
}
cur = cur.next;
}
prev.next = null;
return head;
}