大家好,我是青空。
快来和青空看看今天的Java每日一题吧
题目
编写代码,移除未排序链表中的重复结点
进阶: 如果不得使用临时缓冲区,该怎么解决?
解法预警
不建议直接看下面答案,可以自己先思考一下怎么处理再看大看比较合适
解法
要想移除链表中的重复结点,我们需要设法记录有哪些是重复的。这里只要用到一个简单的散列表。
在下面的解法中,我们会直接迭代访问整个链表,将每个结点加入散列表。若发现有重复元 素,则将该结点从链表中移除,然后继续迭代。这个题目使用了链表,因此只需扫描一次就能搞定。
public static void deleteDups(LinkedListNode n) {
HashSet<Integer> set = new HashSet<Integer>();
LinkedListNode previous = null;
while (n != null) {
if (set.contains(n.data)) {
previous.next = n.next;
} else {
set.add(n.data);
previous = n;
}
n = n.next;
}
}
进阶:不得使用缓冲区
如不借助额外的缓冲区,可以用两个指针来迭代:current迭代访问整个链表,runner用于 检查后续的结点是否重复。
public static void deleteDupsB(LinkedListNode head) {
if (head == null) return;
LinkedListNode current = head;
while (current != null) {
/* Remove all future nodes that have the same value */
LinkedListNode runner = current;
while (runner.next != null) {
if (runner.next.data == current.data) {
runner.next = runner.next.next;
} else {
runner = runner.next;
}
}
current = current.next;
}
}