删除链表的重复数据

来源:互联网 发布:杭州华智软件 编辑:程序博客网 时间:2024/06/14 05:26

分析:

  • 遍历链表,用Hashtable或者HashMap,判断值是否已经存在。
  • 双重循环遍历,不需要额外存储空间,时间复杂度较高。外循环为P,内循环遍历时,删除所有与P相同的值。支持一个值具有多个相同的值。

    代码实现:

import java.util.Hashtable;class Node{    public int data;    public Node next;    public Node(int data){        this.data = data;        this.next = null;    }}public class MyLinkedList {    Node head = null;    //add new node    public void addNode(int data){        Node newNode = new Node(data);        if (head==null) {            head = newNode;            return;        }        Node tmp = head;        while(tmp.next!=null) {            tmp = tmp.next;        }        tmp.next = newNode;    }    //delete ith    public boolean deleteNode(int index){        if (index<1 || index>length()) {            return false;        }        if (index==1) {            head = head.next;            return true;        }        int i=1;        Node preNode = head;        Node curNode = preNode.next;        while (curNode!=null) {            if (i==index) {                preNode.next = curNode.next;                return true;            }            preNode = curNode;            curNode = curNode.next;            i++;        }        return true;    }    //return LinkedList length value    private int length() {        // TODO Auto-generated method stub        int length = 0;        Node tmp = head;        while (tmp!=null) {            length++;            tmp = tmp.next;        }        return length;    }    //sort and return head    public Node orderList(){        Node curNode = head;        Node nextNode = null;        int tmp = 0;        while(curNode.next!=null) {            nextNode = curNode.next;            while (nextNode!=null) {                if (curNode.data>nextNode.data) {                    tmp = curNode.data;                    curNode.data = nextNode.data;                    nextNode.data = tmp;                }                nextNode = nextNode.next;            }            curNode = curNode.next;        }        return head;    }    //print list    public void printList(){        Node tmp =  head;        while(tmp!=null){            System.out.print(tmp.data+" ");            tmp = tmp.next;        }    }    //delete the same Node    public Node deleteDuplecate(){        Node curNode = head;        Node preNode = null;        Hashtable<Integer, Integer> hashtable = new Hashtable<>();        while(curNode!=null){            if (hashtable.containsKey(curNode.data)) {                preNode.next = curNode.next;            }else {                hashtable.put(curNode.data, 1);                preNode = curNode;            }            curNode = curNode.next;        }        return head;    }    //no extra storage    public Node deleteDuplecate2(){        Node pNode = head;        Node qNode = null;        while (pNode!=null) {            qNode = pNode;            while (qNode.next!=null) {                if (pNode.data==qNode.next.data) {                    qNode.next = qNode.next.next;                }else {                    qNode = qNode.next;                }            }            pNode = pNode.next;        }        return head;    }    public static void main(String[] args){        MyLinkedList list = new MyLinkedList();        list.addNode(5);        list.addNode(3);        list.addNode(1);        list.addNode(3);        list.addNode(4);        list.addNode(3);        System.out.println("List length is: "+list.length());        System.out.println("before is: ");        list.printList();        System.out.println();        System.out.println("after order is: ");        list.orderList();        list.printList();        System.out.println();        System.out.println("delete duplecate is: ");        //list.deleteDuplecate();        list.deleteDuplecate2();        list.printList();        System.out.println();    }}

运行结果:

List length is: 6
before is:
5 3 1 3 4 3
after order is:
1 3 3 3 4 5
delete duplecate is:
1 3 4 5

0 0
原创粉丝点击