1 package MutuLink; 2 3 public class MyList { 4 private Node head; 5 private Node tail; 6 private int size = 0; 7 8 public MyList() { 9 head = new Node(); 10 tail = new Node(); 11 head.next =null; 12 tail.pre = null; 13 } 14 15 public boolean empty() { 16 if (head.next == null) 17 return true; 18 return false; 19 } 20 //找到所找下标节点的前一个节点 21 public Node findpre(int index){ 22 Node rnode = head; 23 int dex = -1; 24 while(rnode.next != null){ 25 //找到了插入节点的上一个节点 26 if( dex== index - 1){ 27 return rnode; 28 } 29 rnode = rnode.next; 30 dex++; 31 } 32 return null; 33 } 34 public Node findthis(int index){ 35 Node rnode = head; 36 //把rnode想象为指针,dex为指向的下标,这个地方很容易错,因为当指向最后一个节点时没有判断IF就跳出循环了 37 int dex = -1; 38 while(rnode.next != null){ 39 if(dex == index) 40 return rnode; 41 rnode = rnode.next; 42 dex++; 43 } 44 if(dex == size - 1){ 45 return rnode; 46 } 47 // Node test = new Node(new Students("haha",1,2)); 48 return null; 49 } 50 51 // 往链表末尾加入节点 52 public void add(Object e) { 53 Node node = new Node(e); 54 Node rnode = head; 55 //如果是空链表的话插入一个节点,这个节点的pre不能指向上一个节点,必须指空 56 if (this.empty()) { 57 rnode.next = node; 58 rnode.next.pre = null; 59 tail.pre = node; 60 size++; 61 } else { 62 while (rnode.next != null) 63 rnode = rnode.next; 64 rnode.next = node; 65 node.pre = rnode; 66 tail.pre = node; 67 size++; 68 } 69 } 70 //往链表的某一个标插入一个节点 71 public boolean add(int index,Object e){ 72 if(index <0||index>=size) 73 return false; 74 Node node = new Node(e); 75 Node prenode = this.findpre(index); 76 node.next = prenode.next; 77 prenode.next.pre = node; 78 prenode.next = node; 79 node.pre = prenode; 80 size++; 81 return true; 82 } 83 public boolean add(int index,MyList myl){ 84 if(index <0 || index >= size) 85 return false; 86 Node prenode = this.findpre(index); 87 // myl.tail.pre.next = prenode.next; 88 // prenode.pre = myl.tail.pre; 89 // tail.pre = null; 90 // prenode.next = myl.head.next; 91 // myl.head.next.pre = prenode; 92 // head.next = null; 93 myl.tail.pre.next = prenode.next; 94 prenode.next.pre = myl.tail.pre.pre; 95 myl.head.next.pre = prenode.pre; 96 prenode.next = myl.head.next; 97 myl.head = null; 98 myl.tail = null; 99 size+=myl.size; 100 return true; 101 } 102 103 public Object remove(int index){ 104 Object ob= this.get(index); 105 if(index <0 || index >= size) 106 return null; 107 //特殊情况,当移除节点是最后一个节点的时候 108 //较为复杂通过画图来写代码 109 if(index == size - 1){ 110 Node prenode = this.findpre(index); 111 this.tail.pre = this.tail.pre.pre; 112 this.tail.pre.next.pre = null; 113 this.tail.pre.next =null; 114 size--; 115 return ob; 116 } 117 //比较复杂,通过画图解决 118 else{ 119 Node prenode = this.findpre(index); 120 prenode.next = prenode.next.next; 121 prenode.next.pre.next = null; 122 prenode.next.pre = prenode.next.pre.pre; 123 size--; 124 return ob; 125 } 126 } 127 128 129 public Object get(int index){ 130 Node thisnode = this.findthis(index); 131 return thisnode.e; 132 } 133 public int size(){ 134 return size; 135 } 136 }到此这篇单向链表的特点是什么(单向链表所具备的特点是)的文章就 介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/qkl-jc/67298.html