您的位置:首页 > 其它

Cracking the coding interview--Q2.1

2014-02-04 15:01 417 查看
题目

原文:

Write code to remove duplicates from an unsorted linked list.

FOLLOW UP

How would you solve this problem if a temporary buffer is not allowed?

译文:

写代码从一个无序的链表移除重复的项

更进一步,

如果不用临时缓存,怎样解决这个问题?

解答

若用额外的存储空间,可以使用Set集合来存储,在Set中添加元素时,集合本身会保证不会出现重复元素,另外若使用java.util.*中的链表LinkedList,也是很简单的,但通常要自己写一个链表,这才是考察的目的。若不使用额外存储,则在遍历的时候修改指针的指向即可……

代码如下:

import java.util.*;

class Q2_1{
public static void removeDuplicates(LinkList ll){
HashSet hs=new HashSet();
Node pre=ll.head;
Node temp=ll.head;
while(temp!=null){
if(hs.contains(temp.getData())){
if(temp==ll.tail){
pre.next=temp.next;
ll.tail=pre;
break;
}else{
pre.next=temp.next;
temp=temp.next;
}
}else{
hs.add(temp.getData());
pre=temp;
temp=temp.next;
}
}

Iterator it =hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
//不使用临时缓存
public static void removeDuplicates2(LinkList ll){
Node current=ll.head;
Node pre;
Node temp;

while(current!=null){
pre=current;
temp=current.next;
while(temp!=null){
if(current.getData()==temp.getData()){
if(temp==ll.tail){
pre.next=temp.next;
ll.tail=pre;
break;
}else{
pre.next=temp.next;
temp=temp.next;
}
}else{
pre=temp;
temp=temp.next;
}
}
current=current.next;
}
ll.print();
}
public static void main(String[] args){
int[] data=new int[]{1,2,3,2,5,2};
/*
//若使用java.util.*中的链表LinkedList
LinkedList ll=new LinkedList();
for(int i=0;i<data.length;i++){
ll.add(data[i]);
}
HashSet hs=new HashSet();
Iterator it =ll.iterator();
while(it.hasNext()){
hs.add(it.next());
}

Iterator it1 =hs.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}
*/

LinkList ll=new LinkList();
for(int i=0;i<data.length;i++){
ll.add(data[i]);
}
removeDuplicates(ll);
//removeDuplicates2(ll);
}
}

class Node{
public Object data;
public Node next;

public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}

class LinkList{
public Node head;
public Node tail;
private int size;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}

public void add(Object i){//在链表结尾插入节点
Node newnode = new Node();
newnode.setData(i);
if(head == null){
head = newnode;
tail = newnode;
size ++ ;
}
else {
tail.setNext(newnode);
tail = newnode;
size ++ ;
}
}

public void print(){
if(head == null){
System.out.println("链表为空");
return;
}
Node temp = head;
while(temp.getNext()!= null){
System.out.println(temp.getData().toString());
temp=temp.getNext();
}
System.out.println(temp.getData().toString());
}
}


此题如有更好的方法,还望交流!
---EOF---
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: