1.编写代码,移除未排序链表中的重复结点。如果不得使用临时缓冲区,该怎么解决?
思路:直接迭代访问整个链表,将每个结点加入散列表。若发现有重复元素,则将该结点从链表中移除,然后继续迭代。使用链表。只需扫描一次即可。时间复杂度是o(N),N是链表结点数目。
import java.util.Hashtable; class LinkedListNode { int data; LinkedListNode next; } public class DeleteNodes { public static void main(String[] args) { // TODO Auto-generated method stub LinkedListNode head = new LinkedListNode(); head.data = 1; LinkedListNode node = new LinkedListNode(); node.data = 1; head.next = node; LinkedListNode tmp = head; while (tmp != null) { System.out.println(tmp.data); tmp = tmp.next; } tmp = deleteDups(head); System.out.println("after delete"); while (tmp != null) { System.out.println(tmp.data); tmp = tmp.next; } } //使用临时缓冲区 public static LinkedListNode deleteDups(LinkedListNode n) { Hashtable table = new Hashtable(); LinkedListNode head = n;//保存头结点 LinkedListNode current = head; while (n != null) { if (table.containsKey(n.data)) { current.next = n.next; } else { table.put(n.data, true); current = n; } n = n.next; } return head; } }