package com.coding.basic.linklist; import com.coding.basic.Iterator; import com.coding.basic.List; public class LinkedList implements List { private Node head; private int thesize; public void add(Object o){ if (head == null) { head = new Node(o,null); /* head.data = o; head.next = null;*/ thesize++; } else { addLast(o); } } public void add(int index , Object o){ if (index > thesize) { throw new IndexOutOfBoundsException(); } else if (index == thesize) { addLast(o); } else if(index<thesize){ Node x = head; int i=0; do { x = x.next; i++; } while (i == index); Node old = x; Node newindex = new Node(o,null); thesize++; } } public Object get(int index){ if (index >= thesize) { throw new IndexOutOfBoundsException(); } else if(index==0){ return head.data; } else { Node x = head; for (int j = 1; j <thesize ; j++) { x = x.next; if (j == index) { break; } } return x.data; } } public Object remove(int index){ Node x = head; for (int i = 1; i <index ; i++) { x = x.next; } Node fus = x.next.next; Node fu = x.next; x.next = fus; Object s = fu.data; fu = null; thesize--; return s; } public int size(){ return thesize; } public void addFirst(Object o){ Node oldfirst = head; head = new Node(o,oldfirst); thesize++; } public void addLast(Object o){ if (head == null) { add(o); } if (thesize == 1) { Node s = new Node(o,null); head.next = s; thesize++; } else { Node x = head; for (int i = 1; i <size() ; i++) { x = x.next; } Node oldlast=x; x = new Node(o,null); oldlast.next = x; thesize++; } } public Object removeFirst(){ head = head.next; thesize--; return head.data; } public Object removeLast(){ Node x = head; for (int i = 1; i <thesize; i++) { x = x.next; } Node fu = new Node(x.data,null); fu.data = x.data; x = null; thesize--; return fu.data; } public Iterator iterator(){ return new Iterator() { Node x = head; int index=0; @Override public boolean hasNext() { if(index<thesize){ index++; return true; }else { return false; } } @Override public Object next() { if (index == 1) { return head.data; }else { x = x.next; return x.data; } } }; } private static class Node{ Object data; Node next; //Node pre; public Node(Object data,Node n) { this.data = data; //this.pre = p; this.next = n; } } /** * 把该链表逆置 * 例如链表为 3->7->10 , 逆置后变为 10->7->3 */ public void reverse(){ int cusize = thesize; //创建list副本,内容一致 LinkedList listbak=new LinkedList(); for (int i = 0; i <thesize ; i++) { Object o = get(i); listbak.add(o); } for (int i = 1; i <cusize ; i++) { addFirst(listbak.get(i)); } //去除后面的内容 int dexsing = thesize / 2 + 1; int sizesign = thesize; for (int i = dexsing; i <sizesign ; i++) { remove(dexsing); } } /** * 删除一个单链表的前半部分 * 例如:linklist = 2->5->7->8 , 删除以后的值为 7->8 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 */ public void removeFirstHalf(){ Node node=head; int sign=thesize; for (int i = 1; i <=sign/2 ; i++) { node = node.next; thesize--; } head = node; } /** * 从第i个元素开始, 删除length 个元素 , 注意i从0开始(删除的元素包括了i) * @param i * @param length */ public void remove(int i, int length){ Node node = head; if (i == 0) { for (int j = 1; j <=length ; j++) { node = node.next; thesize--; } head = node; } else if (i != 0 && length < thesize-i) { int sizesign = thesize; Node f; Node l; for (int j =1; j <i ; j++) { node = node.next; } f = node; for (int j = 1; j <=i+length ; j++) { node = node.next; } l = node; f.next = l; thesize = thesize - length; }else { for (int j = 1; j <i ; j++) { node = node.next; } node.next = null; thesize = i; } } /** * 假定当前链表和list均包含已升序排列的整数 * 从当前链表中取出那些list所指定的元素 * 例如当前链表 = 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[] res = new int[list.size()]; for (int i = 0; i <list.size() ; i++) { if ((Integer)list.get(i)<size()) { res[i] = (int) this.get((Integer) list.get(i)); } } return res; } /** * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 * 从当前链表中中删除在list中出现的元素 * @param list */ public void subtract(LinkedList list){ for (int i = 0; i <list.size() ; i++) { //int sizesign = thesize; for (int j = 0; j <thesize ; j++) { if (list.get(i).equals(get(j))) { remove(j); } } } } /** * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) */ public void removeDuplicateValues(){ for (int i = 0; i <size() ; i++) { Object sign = get(i); for (int j = i+1; j <size() ; j++) { if (sign.equals(get(j))) { remove(j); } } } } /** * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) * @param min * @param max */ public void removeRange(int min, int max){ if((Integer)(get(size()-1)) <min|| (Integer)get(0)>max){ } else if (min < (Integer) (get(size() - 1))&&(Integer) (get(size() - 1))<max&& min>(Integer) (get(0))){ Node node = head; if ((Integer) head.data > min) { Node newhead = new Node(null,null); head = newhead; thesize = 0; }else for (int i = 1; i <size() ; i++) { //node = node.next; if ((Integer) node.next.data > min) { node.next = null; thesize = i + 1; }else { node = node.next; } } } else if (min < (Integer) (get(0))&&(Integer) (get(0))<max&& (Integer)get(size()-1)<max) { Node node = head; for (int i = 1; i <size() ; i++) { node = node.next; if ((Integer) node.data > max) { head = node; thesize = thesize - i; break; } } }else { Node node = head; Node nodemin=null; Node nodemax = null; int minsign = 0; int maxsign=0; for (int i = 1; i <size() ; i++) { if ((Integer) node.next.data > min) { nodemin = node; minsign = i-1; break; } node = node.next; } for (int i = 1; i <size() ; i++) { if ((Integer) node.next.data > max) { nodemax = node.next; maxsign = i+1; break; } node = node.next; } nodemin.next = nodemax; System.out.println(minsign); System.out.println(maxsign); thesize = thesize - (maxsign - minsign); } } /** * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 * @param list */ public LinkedList intersection( LinkedList list){ LinkedList list1 = new LinkedList(); for (int i = 0; i <size() ; i++) { for (int j = 0; j <list.size() ; j++) { if (get(i).equals(list.get(j))) { list1.add(get(i)); } } } return list1; } }