package com.coding.basic; import java.util.Arrays; public class LinkedList implements List { private Node head; private Node last; private int size=0; public void add(Object o){ if(head==null){ head =new Node(); head.data=o; last=head; } else{ Node temp=new Node(); temp.data=o; last.next=temp; last=temp; } size++; } public boolean enCapacity(int index){ if(index>=0&&index<size){ return true; } return false; } public Node indexOf(int index){ if(enCapacity(index)){ Node current=head; int currentIndex=0; while(current!=null){ if(currentIndex==index){ return current; } current=current.next; currentIndex++; } } return null; } public void add(int index , Object o){ if(enCapacity(index)){ Node newNode=new Node(); newNode.data=o; if(index==0){ newNode.next=head; head=newNode; } else{ Node BIndexOf=indexOf(index-1); Node indexOf=indexOf(index); newNode.next=indexOf; BIndexOf.next=newNode; } size++; } else if(index==size){ Node newNode=new Node(); newNode.data=o; last.next=newNode; last=newNode; } } public Object get(int index){ if(enCapacity(index)){ Node current=head; int currentIndex=0; while(current!=null){ if(currentIndex==index){ return current.data; } current=current.next; currentIndex++; } } return null; } public Object remove(int index){ Node remove =indexOf(index); if(index==0){ head=head.next; size--; return remove.data; } else if(index+1==size){ Node bRemove =indexOf(index-1); bRemove.next=null; last=bRemove; size--; return remove.data; } else if(remove!=null){ Node bRemove =indexOf(index-1); Node aRemove =indexOf(index+1); bRemove.next=aRemove; size--; return remove.data; } return null; } public int size(){ return size; } public void addFirst(Object o){ Node first=new Node(); first.data=o; first.next=head; head=first; size++; } public void addLast(Object o){ Node last=new Node(); last.data=o; this.last.next=last; this.last=last; size++; } public Object removeFirst(){ Node temp=head; head=head.next; size--; return temp.data; } public Object removeLast(){ Node temp=last; last=indexOf(size-2); last.next=null; size--; return temp.data; } public Iterator iterator(){ return null; } private static class Node{ Object data; Node next; } public class ListIterator implements Iterator{ private int curos; @Override public boolean hasNext() { // TODO Auto-generated method stub return curos!=size; } @Override public Object next() { // TODO Auto-generated method stub int i=0; curos=i+1; return get(i); } } /** * 把该链表逆置 1 2 3 4 5 * 例如链表为 3->7->10 , 逆置后变为 10->7->3 */ public void reverse(){ Node temp1=last; for(int i=size-2;i>=0;i--){ Node temp2=indexOf(i); temp1.next=temp2; temp1=temp2; } head.next=null; temp1=head; head=last; last=temp1; } /** * 删除一个单链表的前半部分 * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 */ public void removeFirstHalf(){ if(size>1){ Node index=indexOf(size/2-1); index.next=null; last=index; size=size-size/2; } } /** * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 * @param i * @param length */ public void remove(int i, int length){//1 2 3 4 5 if( i<size && i>=0){ int len=length+i>size? size-i:length; int j=0; while(j<len){ remove(i); j++; } } /*if((length+i)<=size && length>0 && i>=0){ Node before=indexOf(i-1); Node after=indexOf(length+i); if(before==null&&after==null){ head=null; last=null; size=0; } else if(before==null&&after!=null){ head=after; size=size-length; } else if(before!=null&&after==null){ before.next=null; last=before; size=size-length; } else{ before.next=after; size=size-length; } }*/ } /** * 假定当前链表和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){ if(list==null){ return null; } int size=list.size; int jude=0; int [] newInt=new int[size]; while(jude<size&&size>0){ int index=(int) list.get(jude); if(index>=0&&index<this.size){ newInt[jude]=(int) get(index); jude++; } } return Arrays.copyOf(newInt, jude); } /** * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 * 从当前链表中中删除在listB中出现的元素 * @param list */ public void subtract(LinkedList list){ if(list==null){ return ; } int size=list.size; int jude=0; while(jude<size&&size>0){ int index=(int) list.get(jude); for(int i=0;i<this.size;i++){ int data=(int) get(i); if(data==index){ if(i==0){ head=indexOf(i+1); } else if(i==this.size-1){ last=indexOf(i-1); last.next=null; } else{ Node bIndex=indexOf(i-1); Node aindex=indexOf(i+1); bIndex.next=aindex; } this.size--; break; } } jude++; } } /** * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) */ public void removeDuplicateValues(){ int i=0; int j=0; Node pre=head; Node next=head.next; while(i<size-1){ if((int)pre.data==(int)next.data){ Node temp=indexOf(j); temp.next=next.next; size--; } j++; next=next.next; if(next==pre){ next=next.next; } if(j==size-1){ pre=pre.next; next=head; j=0; i++; } } /*for(int i=0;i<size;i++){ int data1=(int) get(i); for(int j=i+1;j<size;j++){ int data2=(int) get(j); if(data1==data2){ if(j==0){ head=indexOf(j+1); } else if(j==this.size-1){ last=indexOf(j-1); last.next=null; } else{ Node bIndex=indexOf(j-1); Node aindex=indexOf(j+1); bIndex.next=aindex; } this.size--; } } }*/ } /** * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) * @param min 1 2 3 4 5 6 7 8 3 ,6 * @param max */ public void removeRange(int min, int max){ if(head==null){ return; } int start=-1; int end=-1; Node temp=head; int i=0; while(temp!=null){ if((start == -1) &&(int)temp.data>min){ start=i; } if((int)temp.data>=max){ end=i; break; } i++; temp=temp.next; } if(start==-1){ start=0; } if(end==-1){ end=size; } this.remove(start,end-start); } /** * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 * @param list */ public LinkedList intersection( LinkedList list){ if(list==null){ return null; } int i=0; int j=0; LinkedList c=new LinkedList(); while(i<this.size&&j<list.size){ if((int)get(i)==(int)list.get(j)){ c.add(get(i)); i++; j++; } else if((int)get(i)>(int)list.get(j)){ j++; } else{ i++; } } return c; } }