java实现单链表、双向链表
本文实例为大家分享了java实现单链表、双向链表的相关代码,供大家参考,具体内容如下
java实现单链表:
packagecode; classNode { Nodenext; intdata; publicNode(intdata) { this.data=data; } } classLinkList { Nodefirst; //头部 publicLinkList() { this.first=null; } publicvoidaddNode(Nodeno) { no.next=first; first=no;//在头部添加 } publicvoiddelectNode() { Noden=first.next; first=null; first=n;//在头部删除 } //删除指定位置 publicintNumber() { intcount=1; //查看有多少元素 Nodend=first; while(nd.next!=null) { nd=nd.next; count++; } returncount; } publicvoiddelectExact(intn) { //删除指定位置 if(n>1) { intcount=1; Nodede=first; while(count<n-1) { de=de.next; count++; } de.next=de.next.next; } else first=first.next; } publicvoidaddExact(intn,Nodend) { if(n>1)//添加指定位置 { intcount=1; Nodede=first; while(count<n-1) { de=de.next; count++; } nd.next=de.next; de.next=nd; } else first=first.next; } publicintfindNode(intn) { intcount=1;//查找一个数对应的位置 Nodede=first; while(de.data!=n) { de=de.next; count++; if(de==null) { return-1; } } returncount; } publicvoidprint() { Nodeno=first;//打印所有 while(no!=null) { System.out.println(no.data); no=no.next; } } } publicclassTextNode { publicstaticvoidmain(String[]args) { LinkListll=newLinkList(); ll.addNode(newNode(12)); ll.addNode(newNode(15)); ll.addNode(newNode(18)); ll.addNode(newNode(19)); ll.addNode(newNode(20)); /*System.out.println(ll.first.data); ll.delectNode(); System.out.println(ll.first.data);*/ System.out.println(ll.Number()); ll.delectExact(3); ll.addExact(3,newNode(100)); System.out.println(ll.Number()); //ll.print(); System.out.println(ll.findNode(112)); } }
java实现双向链表:
publicclassDoubleLink { publicstaticvoidmain(String[]args) { Node2no=newNode2(5); no.addLeft(newNode2(6)); no.addRight(newNode2(7)); /*no.print(); no.print2();*/ no.addExact2(1,newNode2(8)); no.print(); System.out.println("--------------"); no.print2(); } } classNode2 { publicNode2first; publicNode2end; publicNode2left; publicNode2right; intdata=0; publicNode2(intn) { first=this; end=this; first.data=n; } //从头部添加 publicvoidaddLeft(Node2before) { first.left=before; before.right=first; first=before; } //从尾部添加 publicvoidaddRight(Node2after) { end.right=after; after.left=end; end=after; } //插入正数(第三声)的第几个 publicvoidaddExact(intn,Node2no) { intcount=0; if(n==0) { addLeft(no); } else { Node2f=first; while(true) { f=f.right; count++; if(count==n) { //此处为四个指针的指向的变化 no.left=f.left; f.left.right=no; //first.left=no; no.right=f; f.left=no; break; } } } } //插入倒数的第几个 publicvoidaddExact2(intn,Node2no) { intcount=0; if(n==0) { addRight(no); } else { Node2f=end; while(true) { f=f.left; count++; if(count==n) { no.left=f; no.right=f.right; f.right.left=no; f.right=no; break; } } } } //正序遍历 publicvoidprint() { System.out.println(first.data); while(first.right!=null) { System.out.println(first.right.data); first=first.right; } //System.out.println(end.data); } //倒序遍历 publicvoidprint2() { System.out.println(end.data); while(end.left!=null) { System.out.println(end.left.data); end=end.left; } } } /*值得注意的是,每一次插入一个新的对象的时候,需要注意指针指向的改变。 首先是这个新的对象两边的指向(左和右),其次是时左边的对象向右的指向 和右边对象向左的指向。 这四个指针的指向必须正确,否则可能导致正序或者倒序遍历无法实现。 */ /*对比单链表,单链表只能从一个方向遍历,因为只有一个头,而双向链表,有头和尾,可以从 *头遍历,也可以从尾遍历,而且其中一个对象因为有两个方向的指针,所以他可以获得左边的 *对象也可以获得右边的对象。 *但是单链表的话,因为只有一个方向,所以只能向左或右。添加对象的时候,双向也可以从头添加,也可以从尾添加。 *如果单链表要实现两个方向添加比较难得,或者说不行,因为他只有向左或向右的一个方向的指针 *而双向链表每个对象都有两个方向的指针没这样更灵活,但是这同样有缺点,因为这样的话每个对象 *都会包含两个指针,这同样内存会消耗更多。 * **/
以上就是本文的全部内容,希望对大家学习java程序设计有所帮助。