有序链表
来源:互联网 发布:出国必备app软件 编辑:程序博客网 时间:2024/04/29 23:25
有序链表
有序链表:插入的元素呈有序状态,删除链头时,就删除最小(或最大)的值,插入时,需要从链头开始搜寻插入的位置。
插入的时间复杂度O(n),平均O(n/2),删除最小(或最大值)的时间复杂度O(1)。
适用场所:适用于需要存取(插入/查找/删除)最小(或最大)数据项的应用。
有序链表接口
public interface SortedListInterface <T extends Comparable<? super T>>{public boolean add(T newEntry);public boolean remove1(T anEntry);public int getPosition(T anEntry);public T getEntry(int givenPosition);public boolean contains(T anEntry);public T remove2 (int givenPosition);public void clear();public int getLength();public boolean isEmpty();public boolean isFull();public void display();public Iterator<T> getIterator();}
有序链表实现类
public class SortedLinkedList <T extends Comparable<? super T>> implements SortedListInterface<T>{private Node firstNode;private int length;public SortedLinkedList() {firstNode=null;length=0;}private Node getNodebefore(T anEntry){Node currentNode=firstNode;Node nodeBefore=null;while(currentNode!=null && anEntry.compareTo(currentNode.getData())>0){nodeBefore=currentNode;currentNode=currentNode.getNextNode();}return nodeBefore;}/** * 迭代方式 */@Overridepublic boolean add(T newEntry) {Node newNode=new Node(newEntry);Node nodeBefore=getNodebefore(newEntry);if(isEmpty()||nodeBefore==null){newNode.setNextNode(firstNode);firstNode=newNode;}else{Node nodeAfter=nodeBefore.getNextNode();newNode.setNextNode(nodeAfter);nodeBefore.setNextNode(newNode);}length++;return true;}/** * 递归方式 * @param newEntry * @return *//*public boolean add(T newEntry) {firstNode=add(newEntry, firstNode);length++;return true;}private Node add(T newEntry,Node currentNode){if(currentNode==null||newEntry.compareTo(currentNode.getData())<=0)currentNode=new Node(newEntry,currentNode);else{Node nodeAfter=add(newEntry,currentNode.getNextNode());currentNode.setNextNode(nodeAfter);}return currentNode;}*/@Overridepublic boolean remove1(T anEntry) {boolean result=false;Node currentNode=firstNode;Node nodeBefore=null;while(currentNode!=null && anEntry.compareTo(currentNode.getData())>=0){if(anEntry.compareTo(firstNode.getData())==0){firstNode=firstNode.getNextNode();currentNode=firstNode;nodeBefore=null;result=true;}else if(anEntry.compareTo(currentNode.getData())==0){currentNode=currentNode.getNextNode();nodeBefore.setNextNode(currentNode);result=true;}else{nodeBefore=currentNode;currentNode=currentNode.getNextNode();}}return result;}@Overridepublic int getPosition(T anEntry) {Node currentNode=firstNode;int position=0;while(currentNode!=null && anEntry.compareTo(currentNode.getData())>0){currentNode=currentNode.getNextNode();position++;}if(anEntry.compareTo(currentNode.getData())==0)position++;elseposition=0;return position;}@Overridepublic T getEntry(int givenPosition) {Node currentNode=firstNode;for(int position=1;position<givenPosition;position++){currentNode=currentNode.getNextNode();}return currentNode.getData();}@Overridepublic boolean contains(T anEntry) {boolean result=false;Node currentNode=firstNode;while(currentNode!=null){if(anEntry.compareTo(currentNode.getData())==0){result=true;break;}currentNode=currentNode.getNextNode();}return result;}@Overridepublic T remove2(int givenPosition) {Node currentNode=firstNode;Node nodebofore=null;int position=1;if(givenPosition<=length){while(position<givenPosition){nodebofore=currentNode;currentNode=currentNode.getNextNode();position++;}nodebofore.setNextNode(currentNode.getNextNode());}return currentNode.getData();}@Overridepublic void clear() {firstNode=null;length=0;}@Overridepublic int getLength() {return length;}@Overridepublic boolean isEmpty() {return length==0;}@Overridepublic boolean isFull() {return false;}@Overridepublic void display() {Iterator iterator=getIterator();while(iterator.hasNext()){System.out.print(iterator.next()+" ");}System.out.println();}@Overridepublic Iterator<T> getIterator() {return new IteratorForLinkedList();}/** * 内部类迭代器 * @author Administrator * */private class IteratorForLinkedList implements Iterator<T>{private Node nextNode;private IteratorForLinkedList() {nextNode=firstNode;}@Overridepublic boolean hasNext() {return nextNode!=null;}@Overridepublic T next() {if(hasNext()){Node returnNode=nextNode;nextNode=nextNode.getNextNode();return returnNode.element;}elsethrow new NoSuchElementException("Illegal call to next();"+"iteration is after end of list.");}public void remove(){//不允许在历遍过程中删除throw new UnsupportedOperationException("remove() is not suported.");}}private class Node {private T element;private Node next;private Node(T element) {this(element,null);}private Node(T element,Node next){this.element=element;this.next=next;}private T getData(){return element;}private void setData(T newData){element=newData;}private Node getNextNode(){return next;}private void setNextNode(Node nextNode){next=nextNode;}}}
测试程序
public class main_sortedlist {private static SortedLinkedList<Integer> list;public static void main(String[] args) {Random ra =new Random();list=new SortedLinkedList<>();for(int i=0;i<30;i++)list.add(ra.nextInt(100)+1);list.display();list.remove1(30);list.display();System.out.println(list.contains(list.getEntry(12)));list.remove2(15);list.display();}}
0 0
- 有序的合并两个有序链表
- 两个有序链表合并为有序
- 有序链表合并&有序数组合并
- 有序链表合并
- 合并有序链表
- 有序链表
- 合并有序链表
- 合并有序链表
- 合并有序链表
- 有序链表合并
- 合并有序链表
- 合并有序链表
- 合并有序链表
- 数据结构:有序链表
- 有序链表合并
- 有序链表合并
- 合并有序链表
- 合并有序链表
- 10.file
- jQuery --deferred 延迟对象
- iOS 自定义步骤实时进度条
- jquery 不常用但重要的api
- js数据类型-re(1)
- 有序链表
- css小杂碎
- Android AIDL分析
- 面向对象3
- js之少用但很重要的语法
- GCC主要数据结构之c_common_identifier
- 转载:事件传递 -》参考(不是最新android的)
- webAudio
- php-mysql