import java.util.Objects; import java.util.Stack; public class LinkedList implements List { private Node head; private Node rear; public boolean isEmpty(){ return true; } public void add(Object o){ if(isEmpty()) addFirst(o); else addLast(o); } public void add(int index , Object o){ if(index<0 || o ==null){ throw new IllegalArgumentException("不合法"); } else if (index == 0 && head == null){ addFirst(o); }else if(index>0 && head == null){ throw new IllegalArgumentException("不合法"); }else{ Node srcNode = (Node) this.get(index); Node newNode = new Node(); newNode.data = o; newNode.next = srcNode.next; srcNode.next.previous = newNode; srcNode.next = newNode; newNode.previous = srcNode; } } public Object get(int index){ Node newNode = new Node(); for(int i = 0;i<index;i++){ newNode = newNode.next; } return newNode; } public Object remove(int index){ Node srcNode = (Node)this.get(index); srcNode.previous.next = srcNode.next; srcNode.next.previous = srcNode.previous; return srcNode.data; } public int size(){ Node newNode = new Node(); newNode = head; int size = 0; while (newNode != rear){ newNode = newNode.next; size++; } return size; } public void addFirst(Object o){ Node newNode = new Node(); newNode.data = o; if(isEmpty()){ rear = newNode; }else{ head.previous = newNode; } newNode.next = head; head = newNode; } public void addLast(Object o){ Node newNode = new Node(); newNode.data = o; if(isEmpty()){ head = newNode; } else { rear.next = newNode; } newNode.previous = rear; rear = newNode; } public Object removeFirst(){ if(isEmpty()) return null; Node temp = head; head = head.next; if (head != null){ head.previous = null; }else{ rear = null; } return temp.data; } public Object removeLast(){ if(isEmpty()) return null; Node temp = rear; rear = rear.previous; if(rear != null){ rear.next = null; } else { head = null; } return temp.data; } public Iterator iterator(){ Iterator ite = new Iterator() { private Node temp = head; @Override public boolean hasNext() { return temp != null; } @Override public Object next() { Object data = temp.data; temp = temp.next; return data; } }; return ite; } private static class Node{ Object data; Node next; Node previous; } /** * 把该链表逆置 * 例如链表为 3->7->10 , 逆置后变为 10->7->3 */ public void reverse(){ Node p1,p2 = null; p1 = head; while (head.next != null){ p2 = head.next; head.next = p2.next; p2.next = p1; p1 = p2; } } /** * 删除一个单链表的前半部分 * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 */ public void removeFirstHalf(){ int size = this.size(); Node newNode = new Node(); newNode = head; if(size%2 == 0){ int length = size/2; for(int i = 0;i<length;i++){ newNode = newNode.next; } head.next = newNode.next; head = newNode; }else{ int length = (size+1)/2; for(int i = 0;i<length;i++){ newNode = newNode.next; } head.next = newNode.next; head = newNode; } } /** * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 * @param i * @param length */ public void remove(int i, int length){ Node newNode = (Node) this.get(i-1); Node remNode = (Node) this.get(i); for(int j=0;j<length-1;j++){ remNode = remNode.next; } newNode.next = remNode; remNode.previous = newNode; } /** * 假定当前链表和listB均包含已升序排列的整数 * 从当前链表中取出那些listB所指定的元素 * 例如当前链表 = 11->101->201->301->401->501->601->701 * listB = 1->3->4->6 * 返回的结果应该是[101,301,401,601] * @param list */ public int[] getElements(LinkedList list){ int[] listB = new int[list.size()-1]; int[] listA = new int[list.size()-1]; int size = list.size(); for(int i=0;i<size;i++){ Node newNode = (Node) this.get(i); listB[i] = (int) newNode.data; } for(int i=0;i<size;i++){ Node newNode = (Node) this.get(listB[i]); listA[i] = (int) newNode.data; } return listA; } /** * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 * 从当前链表中中删除在listB中出现的元素 * @param list */ public void subtract(LinkedList list){ int[] listB = new int[list.size()-1]; int[] listA = new int[this.size()-1]; int sizeB = list.size(); int sizeA = listA.length; for(int i=0;i<sizeB;i++){ Node newNode = (Node) this.get(i); listB[i] = (int) newNode.data; } for(int i=0;i<sizeA;i++){ Node newNode = (Node) this.get(i); listA[i] = (int) newNode.data; } for(int i = 0;i<sizeB ;i++){ for(int j = 0;j<sizeA ;j++){ if(listB[i] == listA [j]){ this.remove(j); }else if(listB[i] < listA [j]) break; } } } /** * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) */ public void removeDuplicateValues(){ int size = this.size(); Node newNode1 = new Node(); Node newNode2 = new Node(); for (int i = 0;i<size;i++){ newNode1 = (Node) this.get(i); newNode2 = (Node) this.get(i+1); if(newNode1.data == newNode2.data){ this.remove(i); } } } /** * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) * @param min * @param max */ public void removeRange(int min, int max){ Node newNode = new Node(); int size = this.size(); for (int i = 0;i<size;i++){ newNode = (Node) this.get(i); if((int)newNode.data > min && (int)newNode.data <max){ this.remove(i); }else if ((int)newNode.data > min && (int)newNode.data > max){ break; } } } /** * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 * @param list */ public LinkedList intersection( LinkedList list){ LinkedList listA = this; LinkedList listB = list; LinkedList listC = new LinkedList(); if(listA == null){ return list; } if(listB == null){ return this; } Node p1 = listA.head; Node p2 = listB.head; Node p3 = listC.head; while(p1 != null && p2 !=null) { if ((int) p1.data <= (int) p2.data) { p3.next = p1; p1 = p1.next; } else { p3.next = p2; p2 = p2.next; } p3 = p3.next; } if(p1 == null){ p3.next = p2; } if(p2 == null){ p3.next = p1; } return listC; } }