删除链表的重复数据
来源:互联网 发布:杭州华智软件 编辑:程序博客网 时间: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
- 删除链表的重复数据
- 删除重复的数据
- 删除重复的数据
- 删除表内重复的数据
- 删除表内的重复数据
- 删除表中重复的数据
- 删除表内多余的重复数据
- 删除SQL表中重复的数据
- 删除表中重复的数据Oracle
- 删除表中重复的数据
- 删除表中重复的数据
- 删除表中重复数据的sql
- 删除表中 user_id重复的数据
- 删除表中重复的数据
- 如何删除重复的数据?
- 删除重复的数据记录
- 重复数据删除的详细信息
- 重复数据删除的方法
- Nutch2.3(二)
- java操作图片生成水印升级版
- 压力测试流程指导规范
- Retrofit基础之:GET与POST请求
- win7中装ubuntu16.04
- 删除链表的重复数据
- JAVA面试题总览--JVM知识
- java操作word生成水印
- vim打开多窗口、多文件之间的切换
- Spring与Redis整合
- virtualBox 的NAT网络模式下,在宿主机windows中,通过VNC连接图形化的CentOS虚拟机界面(亲测成功)
- linux环境变量配置与区别
- Mac Apache服务器配置
- 报错集锦