单链表的实现---SingleLinkedList
单链表的实现,定义为SingleLinkedList
class Node<AnyType>{ //结点Node类 public AnyType data; public Node<AnyType> next; public Node(AnyType d,Node<AnyType> next ){ this.data=d; this.next=next; } public Node(AnyType d){ this.data=d; this.next=null; } public Node(){ this.data=null; this.next=null; } } public class SingleLinkedList<AnyType extends Comparable<?super AnyType>> { int theSize; Node<AnyType> firstNode; //定义第一个结点 public SingleLinkedList(){ //对链表初始化 this.firstNode=null; theSize=0; } public int getSize(){ //获取链表长度 int count=0; if(firstNode==null) return 0; Node<AnyType> p=firstNode; while(p!=null){ count++; p=p.next; } return count; } public Node<AnyType> getNode(int idx){ //获取idx对应的结点 Node<AnyType> p; if(idx<0||idx>getSize()){ //判断idx的合法性 return null; } else{ p=firstNode; for(int i=0;i<idx;i++){ p=p.next; } return p; } } public AnyType setNode(int idx,AnyType newData){ //替换单链表中idx位置的数据 Node<AnyType> p=firstNode; if(idx<0||idx>getSize()) return null; else{ for(int i=0;i<idx;i++) p=p.next; AnyType oldData=p.data; p.data=newData; return oldData; } } public boolean add(AnyType x){ //插入元素,未给出idx自动加到表尾 add(getSize(),x); return true; } public void add(int idx,AnyType x){ //将元素加到idx位置 Node<AnyType> newNode=new Node<AnyType>(x); if(firstNode==null||idx==0){ //空表 newNode.next=firstNode; firstNode=newNode; theSize++; } else if(idx>theSize+2){ //idx不合法时处理方法 System.out.println("插入失败"); } else{ Node<AnyType> p=getNode(idx-1); newNode.next=p.next; p.next=newNode; theSize++; } } public Boolean remove(int idx){ if(firstNode==null){ //空表 return false; } else if(idx==0||firstNode.next==null){ //只有一个结点或idx=0; Node<AnyType> p=this.firstNode; //定义结点p,将头结点的值赋给p firstNode=p.next; //令头结点为p的下一个结点,即删除头结点 theSize--; return true; } else{ Node<AnyType> p=getNode(idx-1); Node<AnyType> q=p.next; p.next=q.next; theSize--; return true; } } public int contains(AnyType x,SingleLinkedList sll){ //判断x是否在链表中 int idx=0; Node<AnyType> p=sll.firstNode; if(sll.firstNode==null) //空表 return -1; while(p.data!=x){ idx++; p=p.next; if(p==null) return -1; } return idx; } public void moveSmall(){ //将最小元素移到链表最前端 Node<AnyType> small=firstNode; Node<AnyType> p=firstNode; int id=0; for(int i=0;i<theSize;i++){ if((Integer)p.data<(Integer)small.data||(Integer)p.data==(Integer)small.data){ small=p; id=i; } p=p.next; } remove(id); add(0,small.data); } public void exchange(int x,int y){ ///交换两个相邻位置的元素 if(x>y){ //使x<y int temp=x;x=y;y=temp; } if(y>getSize()-1){ //输入数据超出范围 System.out.println("数据超出范围,交换失败"); } else if(getSize()==2){ //单链表只有两个元素 Node<AnyType> p=getNode(1); p.next=firstNode; firstNode.next=null; firstNode=p; } else if(getSize()>2&&y==getSize()-1){ //元素个数大于二,交换表尾的两个数据 Node<AnyType> p=getNode(x-1); Node<AnyType> q=p.next; p.next=q.next; p.next.next=q; q.next=null; } else if(getSize()>2&&x==0){ //元素个数大于二,交换表头的两个数据 Node<AnyType> p=getNode(1); firstNode.next=p.next; p.next=firstNode; firstNode=p; } else if(getSize()>3){ //元素个数大于4,交换不挨边的数据 Node<AnyType> p=getNode(x-1); Node<AnyType> q=getNode(x); Node<AnyType> r=getNode(y); p.next=r.next; q.next=p.next; r.next=q; p.next=r; } } public void merge(SingleLinkedList La,SingleLinkedList Lb){ //把Lb的元素接到La尾 for(int i=0;i<Lb.getSize();i++){ Node<AnyType> p=Lb.getNode(i); AnyType m=p.data; La.add(m); } } public static void main(String[] args) { //验证部分 SingleLinkedList<Integer> La=new SingleLinkedList<Integer>(); SingleLinkedList<Integer> Lb=new SingleLinkedList<Integer>(); La.add(1); La.add(2); La.add(3); La.add(4); La.add(5); La.add(6); Lb.add(11); Lb.add(12); Lb.add(13); System.out.println("长度为:"+La.getSize()); for(int i=0;i<La.getSize();i++){ System.out.println(La.getNode(i).data); } System.out.println("........................"); La.setNode(3,0); La.remove(0); System.out.println("长度为:"+La.getSize()); for(int i=0;i<La.getSize();i++){ System.out.println(La.getNode(i).data); } System.out.println("........................"); La.add(2,9); System.out.println("长度为:"+La.getSize()); for(int i=0;i<La.getSize();i++){ System.out.println(La.getNode(i).data); } System.out.println("........................"); System.out.println("结果:"+La.contains(91,La)); System.out.println("........................"); La.merge(La,Lb); for(int i=0;i<La.getSize();i++){ System.out.println(La.getNode(i).data); } System.out.println("........................"); System.out.println("长度为:"+La.getSize()); La.exchange(1,2); for(int i=0;i<La.getSize();i++){ System.out.println(La.getNode(i).data); } } }