package com.coding.basic; import java.util.concurrent.CyclicBarrier; /** * @ClassName: LinkedList * @Description: 带头结点的单向列表. * @author: tangxp * @date: 2017年2月23日 下午9:14:28 */ public class LinkedList implements List { private Node head = new Node(); private int size ; public void add(Object o){ add(size,o); } public void add(int index , Object o){ if(index<0 || index>size) { throw new IllegalArgumentException("目前链表长度不够!"); } Node tempHead = head; int i = 0; while(i++ < index) { tempHead = tempHead.next; } addDriect(getNode(o),tempHead); } /** * @Title: get * @Description: TODO * @param index * @return * @see com.coding.basic.List#get(int) */ public Object get(int index){ if(index<0|| index>=size) { throw new IllegalArgumentException("下标超出链表范围!"); } Node tempHead = head; int i = 0; while(i++ < index) { tempHead = tempHead.next; } return tempHead.next.data; } public Object remove(int index){ if(index<0 || index>=size) { throw new IllegalArgumentException("下标超出链表范围!"); } Node tempHead = head; int i = 0; while(i++ < index) { tempHead = tempHead.next; } Node removingNode = tempHead.next; tempHead.next = removingNode.next; removingNode.next = null; size--; return removingNode.data; } public int size(){ return size; } public void addFirst(Object o){ add(0,o); } public void addLast(Object o){ add(o); } public Object removeFirst(){ return remove(0); } public Object removeLast(){ return remove(size-1); } public Iterator iterator(){ return null; } private void addDriect(Node n,Node before) { Node temp = before.next; n.next = temp; before.next = n; size++; } private Node getNode(Object o) { if(null == o) { throw new IllegalArgumentException("节点值不能为空"); } Node n = new Node(); n.data = o; return n; } @Override public String toString() { StringBuilder sb = new StringBuilder("size: "+size+" {null | ---}--->"); if(null == head.next) { return sb.toString(); } Node tempHead = head; while(null != tempHead.next ) { sb.append(tempHead.next.toString()); tempHead = tempHead.next; } sb.append("null"); return sb.toString(); } private static class Node{ Object data; Node next; @Override public String toString() { return "{" + this.data +" |---}--->"; } } //数据结构习题 /** * 把该链表逆置 * 例如链表为 3->7->10 , 逆置后变为 10->7->3 */ public boolean reverse(){ if (this.size()<=0) { return false; } Stack stack = new Stack(); while(this.size()>0) { stack.push(this.removeFirst()); } while(stack.size()>0) { this.addLast(stack.pop()); } return true; } /** * 删除一个单链表的前半部分 * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 */ public boolean removeFirstHalf(){ if (this.size()<=0) { return false; } //计算中间位置 int tempCount = this.size(); tempCount = tempCount%2 == 0 ? tempCount/2 : (tempCount-1)/2; tempCount--; while(tempCount >= 0) { this.removeFirst(); tempCount --; } return true; } /** * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 * @param i * @param length */ public void remove(int i, int length){ if(i<0|| i>=size) { throw new IllegalArgumentException("下标超出链表范围!"); } if (!(length>0|| (i+1+length)<=this.size())) { throw new IllegalArgumentException("参数非法!"); } Node tempHead = head; head = getNode(i-1); while(length-->0){ this.removeFirst(); } head = tempHead; } /** * 获取第i个元素的引用 */ public Node getNode(int index) { if(index<0|| index>=size) { throw new IllegalArgumentException("下标超出链表范围!"); } Node tempHead = head; int i = 0; while(i++ < index) { tempHead = tempHead.next; } return tempHead.next; } /** * 假定当前链表和listB均包含已升序排列的整数 * 从当前链表中取出那些listB所指定的元素 * 例如当前链表 = 11->101->201->301->401->501->601->701 * listB = 1->3->4->6 * 返回的结果应该是[101,301,401,601] * @param list */ public Integer[] getElements(LinkedList list){ int listSizeB = list.size(); int i=0; Integer res[] = new Integer[listSizeB]; while(listSizeB-- > 0) { res[i] = (Integer) this.get((Integer)list.get(i)); i++; } return res; } /** * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 * 从当前链表中中删除在listB中出现的元素 * @param list */ public void subtract(LinkedList list){ Node tempNodePre = this.head; Node tempNode = this.head.next; Node tempNodeB = list.head.next; Node temp = null; while(null != tempNode && null != tempNodeB) { Integer a = (Integer) tempNode.data; Integer b = (Integer) tempNodeB.data; if (a < b) { tempNodePre = tempNodePre.next; tempNode = tempNode.next; } else if(a > b){ tempNodeB = tempNodeB.next; }else { temp = tempNode; tempNodePre.next = tempNode.next; tempNode = tempNode.next; temp.next = null; temp = null; } } } /** * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) */ public void removeDuplicateValues(){ Node tempPre = this.head; Node tempCur = this.head.next; Node temp = null; while(null != tempCur) { Integer a = (Integer) tempPre.data; Integer b = (Integer) tempCur.data; if(a == b) { temp = tempCur; tempPre.next = tempCur.next; tempCur = tempCur.next; temp.next = null; temp = null; }else { tempPre = tempPre.next; tempCur = tempCur.next; } } } /** * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) * @param min * @param max */ public void removeRange(int min, int max){ if (min<0 || max<min || this.size()<2) { throw new IllegalArgumentException(); } Node pre = this.head.next; Node cur = this.head.next.next; Node preMin = null; Node preMax = null; while(null != cur) { Integer a = (Integer) pre.data; Integer b = (Integer) cur.data; if (a<min && b>=min) { preMin = pre; } if (a<=max && b>max) { preMax = pre; } pre = pre.next; cur = cur.next; } preMin.next = preMax.next; preMax = null; } /** * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 * @param list */ public LinkedList intersection( LinkedList listB){ Node nodeA = this.head.next; Node nodeB = listB.head.next; LinkedList listC = new LinkedList(); while (null != nodeA && null != nodeB) { Integer a = (Integer) nodeA.data; Integer b = (Integer) nodeB.data; if (a>b) { nodeB = nodeB.next; } else if(a<b){ nodeA = nodeA.next; }else { listC.add(nodeA.data); nodeA = nodeA.next; nodeB = nodeB.next; } } return listC; } }