[链表]–移除重复节点
题目链接
题目
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。
示例
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
解析
首先看到就会想到 Set 集合去重,这个就啪的一下很快啊,一下子就出来了,就是时间复杂度感觉有点高哈,所以试试另一种:
- 既然链表长度和元素都在[0, 20000]范围内,那定义一个 ListNode[];
- 遍历链表进行判断:
(1)如果当前节点所对应的数组下标有值,就跳过该节点;
(2)如果当前节点所对应的数组下标没有值,就将值添加到数组里面,并连接到链表。
代码实现
public class Interview0201 {
/**
* Definition for singly-linked list
*/
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
/**
* 1.使用 set 装入结点的值,
* 2.遍历链表, 如果已经有相同的值, 就删除这个结点
*/
/*public ListNode removeDuplicateNodes(ListNode head) {
// 用来保存结点的值
Set<Integer> set = new HashSet<>();
ListNode cur = head;
// 当前结点 cur 的前驱结点. 以便删除
ListNode prev = null;
while (cur != null) {
if (!set.contains(cur.val)) {
prev = cur;
set.add(cur.val);
}else {
prev.next = cur.next;
}
cur = cur.next;
}
return head;
}*/
/**
* 定义一个 ListNode[], 把结点的 val 看作是下标
* 1.当前下标下数组元素为 null, 添加到数组里面
* 2.当前下标数组元素不为 null, 就删除当前结点;
* 相比于 set 时间空间都好很多
*/
public ListNode removeDuplicateNodes(ListNode head) {
ListNode[] nodes = new ListNode[20001];
ListNode cur = head;
ListNode prev = null;
while (cur != null) {
if (nodes[cur.val] == null) {
nodes[cur.val] = cur;
prev = cur;
}else {
prev.next = cur.next;
}
cur = cur.next;
}
return head;
}
}
-----------------------------------------------------------------------------有始有终分割线----------------------------------------------------------------------------------