单链表的java实现即链表的常见操作
2014-07-02 15:17
295 查看
package Test1; public class MyList { protected IntNode head,tail; //构造函数 public MyList(){ head=null; tail=null; } //判断是否为空 public boolean isEmpty(){ return head==null; } //返回大小 public int size(){ int size=0; for(IntNode it=head;it!=null;it=it.next) size++; return size; } //在连头添加节点 public void addToHead(int el){ head=new IntNode(el,head); if(tail==null) tail=head; } //在连尾添加节点 public void addToTail(int el){ if(!isEmpty()){ tail.next=new IntNode(el,null); tail=tail.next; }else head=tail=new IntNode(el,null); } public void addToTail(IntNode el){ if(!isEmpty()) { tail.next=el; el.next=null; }else { head=el; el.next=null; } } //从连头删除节点 public boolean deleteFromHead(){ if(isEmpty()) return false; if(head==tail) head=tail=null; else head=head.next; return true; } //从连尾删除节点 public boolean deleteFromTail(){ if(isEmpty()) return false; if(head==tail) head=tail=null; else{ IntNode tmp; for(tmp=head;tmp.next!=tail;tmp=tmp.next); tail=tmp; tail.next=null; } return true; } //打印出链表的内容 public void printAll(){ for(IntNode i=head;i!=null;i=i.next) System.out.print(i.info); } //判断一个整数是否在链表中 public boolean isInList(int el){ boolean res=false; for(IntNode i=head;i!=null;i=i.next) { if(i.info==el){ res=true; break; } } return res; } //删除指定的元素 删除返回true 没有返回false public boolean delete(int el){ boolean res=false; for(IntNode i=head;i!=null;i=i.next) { if(i.info==el) { if(i==head) deleteFromHead(); else if(i==tail) deleteFromTail(); else { IntNode tmp; for(tmp=head;tmp.next!=i;tmp=tmp.next); tmp.next=i.next; } } } return res; } //删除链表中的第 i个节点 删除成功返回true,失败返回false public boolean delete0(int index){ boolean res=false; int i=1; IntNode it=head; while(i<index&&it!=null) { it=it.next; i++; } if(i==index&&it!=null) { if(it.next==null) deleteFromTail(); else if(it==head) deleteFromHead(); else { IntNode tmp=head; for(;tmp.next!=it;tmp=tmp.next); tmp.next=it.next; } res=true; } return res; } //反转链表 public void reverseList(){ if(head==null||head.next==null) return ; else { IntNode it=head.next; IntNode itf=head; IntNode itb=it.next; while(itb != null) { it.next=itf; itf=it; it=itb; itb=it.next; } it.next=itf; head.next=null; IntNode tmp; tmp=head; head=tail; tail=tmp; } } //合并两个有序的链表 //L1:1->3->6 //L2:4->5->7 //合并后:1->2->4->5->6->7 public static MyList mergeList(MyList l1,MyList l2){ MyList res=new MyList(); IntNode p1=l1.head; IntNode p2=l2.head; while(p1!=null&&p2!=null) { if(p1.info<p2.info) { res.addToTail(p1.info); p1=p1.next; }else { res.addToTail(p2.info); p2=p2.next; } } if(p1==null){ for(IntNode i=p2;i!=null;i=i.next) res.addToTail(i.info); }else { for(IntNode i=p1;i!=null;i=i.next) res.addToTail(i.info); } return res; } //判断两个单向链表是否有相同的内容 public boolean equal(MyList list){ return head==list.head; } //在a之后,b之前插入节点 public void insertToPrev(IntNode el,IntNode pa){ if(pa==head) addToHead(el.info); else{ IntNode prev=head; for(;prev.next!=pa;prev=prev.next); prev.next=el; el.next=pa; } } public void insertToBack(IntNode el,IntNode pb){ if(pb==tail) addToTail(el.info); else{ el.next=pb.next; pb.next=el; } } //将L链表连接到尾部 public void listCat(MyList list){ for(IntNode it=list.head;it!=null;it=it.next) addToTail(it.info); } //进行升序排列 public void sort(){ for(IntNode i=head;i.next!=null;i=i.next) { IntNode minPointer=i; int min=i.info; for(IntNode j=head.next;j!=null;j=j.next) { if(j.info<min) { minPointer=j; min=j.info; } } if(minPointer!=i){ int tmp=i.info; i.info=minPointer.info; minPointer.info=tmp; } } } //测试用列 public static void main(String[] args){ MyList l1=new MyList(); l1.addToTail(1); l1.addToTail(9); l1.addToTail(6); l1.sort(); l1.printAll(); System.out.println(l1.size()); MyList l2=new MyList(); l2.addToHead(4); l2.addToHead(7); l2.addToHead(6); l2.sort(); l2.printAll(); System.out.println(); MyList l3=MyList.mergeList(l1, l2); l3.printAll(); System.out.println(l3.size()); } } class IntNode{ public int info; public IntNode next; public IntNode(int info,IntNode next){ this.info=info; this.next=next; } public IntNode(int info){ this(info,null); } }
相关文章推荐
- 链表基础操作与常见题目Java实现
- Java实现单向链表及其常见操作
- 链表常见操作java实现一:链表初始化,求链表长度
- 链表常见操作java实现二:反转链表,从尾到头倒序遍历
- java实现二叉树的常见操作
- java实现二叉树的常见操作
- Java实现双向链表的基本操作
- java实现链表及其相关操作
- Java实现单链表插入删除等基本操作
- java实现二叉树的常见操作
- 链表基本操作java实现
- 链表插入、链表相加、链表相乘、链表排序、链表合并等操作的java实现
- java实现链表以及相关操作
- java实现二叉树的常见操作
- 单链表操作,队列,栈实现,以及常见字符串库函数经典实现
- java实现二叉树的常见操作
- java实现双向链表的操作
- 链表的java实现以及基本的增加,删除,排序操作
- 链表的各种操作(Java实现)
- 单链表的基本操作与算法(Java实现)