日常学习随笔-单链表学习测试
Posted 小风微灵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日常学习随笔-单链表学习测试相关的知识,希望对你有一定的参考价值。
今天自己自定义了一个单链表,定义了部分功能!直接贴代码吧!
1 package com.xfwl.algorithmAnalysis.linklsit; 2 /** 3 * 堆栈学习 4 * @function 自定义单链表 5 * @author 小风微凉 6 * @time 2018-5-10 下午1:33:13 7 */ 8 public class MyLinkDefin { 9 //定义一个头结点 10 Node head=null; 11 /** 12 * 链表中的结点,data代表结点的值,next是指向下一个结点的引用 13 */ 14 class Node{ 15 Node next=null;//结点的指针域 16 int data;//结点的数据域 17 public Node(int data){ 18 this.data=data; 19 } 20 } 21 22 /** 23 * 向链表中添加一个结点 24 * @param data 25 */ 26 public void addNode(int data){ 27 //创建一个结点 28 Node node=new Node(data); 29 //当前链表的头结点是否指向下一个节点 30 if(head==null){//懒汉式 31 head=node; 32 return ; 33 } 34 //头结点没有指向 35 Node temp=head; 36 //找到最后一个结点 37 while(temp.next!=null){ 38 temp=temp.next; 39 } 40 //新结点加到最后一个位置上 41 temp.next=node; 42 } 43 /** 44 * 在指定的位置,添加结点 45 * @param index 位置 46 * @param data 结点信息 47 */ 48 @SuppressWarnings("unchecked") 49 public void addNodeElem(int index,int data){ 50 //结点位置合法性判断 51 if(index<0 || index >length()){ 52 System.out.println("当前位置不在链表有效长度范围内,请重新选择要添加的结点位置!"); 53 }else{ 54 //结点位置合法 55 Node curNode=new Node(data);//创建一个新的结点 56 //插入的是头结点的位置 57 if(index==0){ 58 curNode.next=head; 59 head=curNode;//设置当前结点为头结点 60 }else{ 61 //插入的不是头结点的位置 62 Node tmp=head; 63 int i=0; 64 while(tmp.next!=null){//开始循环检索要添加结点的位置 65 if(i==index-1){//找到插入位置的前一位 66 Node preNode=tmp;//插入位置的前一个结点 67 /**开始设置结点移动**/ 68 curNode.next=preNode.next;//当期结点指向被迫后移的结点 69 preNode.next=curNode;//当前新增的结点插入前一个结点后面 70 System.out.println("成功在"+index+"索引处添加了一个结点:"+data); 71 break; 72 }else{//继续循环 73 tmp=tmp.next; 74 i++; 75 } 76 } 77 //插入尾部 78 tmp.next=curNode; 79 System.out.println("成功在链表尾部处添加了一个结点:"+data); 80 } 81 } 82 } 83 /** 84 * 删除第index个结点 85 * @param index 结点位置索引值 86 * @return 87 */ 88 @SuppressWarnings("unchecked") 89 public boolean delNode(int index){ 90 //位置范围检查 91 if(index<0|| index>length()){ 92 System.out.println("当前位置不在链表有效长度范围内,请重新选择要删除的结点位置!"); 93 return false; 94 } 95 //如果要删除的是头结点 96 if(index==0){ 97 head=head.next;//取头结点之后的第一个结点复制给头结点 98 return true; 99 } 100 //如果删除的不是头结点,是后续子结点 101 int i=0; 102 Node preNode=head;//拿到头结点,依次向后获取其他结点 103 Node curNode=preNode.next; 104 while(curNode!=null){//当前结点存在 105 if(i==index){//找到要删除的结点位置 106 preNode.next=curNode.next;//改变结点引用指向 107 return false; 108 } 109 //没有找到时的处理 110 preNode=curNode; 111 curNode=curNode.next; 112 i++; 113 } 114 //没有找到删除的位置或者删除操作失败 115 return false; 116 } 117 /** 118 * 获取当前链表的长度 119 * @return 120 */ 121 public int length(){ 122 int len=0; 123 Node temp=head; 124 while(temp!=null){ 125 len++; 126 temp=temp.next; 127 } 128 return len; 129 } 130 /** 131 * 在不知道结点位置的情况下直接删除结点 132 * @param n 133 * @return 134 */ 135 public boolean delNodeElem(Node n){ 136 //结点和法性判断 137 if(n==null || n.next==null){ 138 System.out.println("要删除的结点异常或不存在!"); 139 return false; 140 } 141 //开始删除结点[用后一个结点的信息覆盖当前结点的信息,即为删除] 142 int tmpData=n.data; 143 n.data=n.next.data; 144 n.next=n.next.next; 145 System.out.println("删除成功!"); 146 return true; 147 } 148 /** 149 * 打印链表信息 150 */ 151 public void printList() { 152 System.out.println("-------------------链表内容如下-------------------"); 153 Node tmp = head; 154 while (tmp != null) { 155 System.out.println(tmp.data); 156 tmp = tmp.next; 157 } 158 System.out.println("-----------------------------------------------"); 159 } 160 /** 161 * 查询指定位置索引处的结点信息 162 * @param index 163 * @return 164 */ 165 public Node getNodeData(int index){ 166 //位置范围检查 167 if(index<0|| index>length()){ 168 System.out.println("位置不合法,请重新输入!返回头结点~"); 169 return head; 170 }else{ 171 int i=0; 172 Node tmp=head; 173 while(tmp.next!=null){ 174 if(i==index){ 175 break; 176 }else{ 177 i++; 178 tmp=tmp.next; 179 } 180 } 181 System.out.println("真实查询结果:"+tmp.data); 182 return tmp; 183 } 184 } 185 /** 186 * 对链表进行排序 187 * @param flag 0 正序 1逆序 188 */ 189 public void sortLinkNode(int flag) { 190 Node nextNode = null; 191 int tmp = 0; 192 Node curNode = head; 193 while (curNode.next != null) { 194 nextNode = curNode.next; 195 while (nextNode != null) { 196 if(flag==0){//正序 197 if (curNode.data > nextNode.data) { 198 tmp = curNode.data; 199 curNode.data = nextNode.data; 200 nextNode.data = tmp; 201 } 202 }else if(flag==1){//逆序 203 if (curNode.data < nextNode.data) { 204 tmp = curNode.data; 205 curNode.data = nextNode.data; 206 nextNode.data = tmp; 207 } 208 } 209 nextNode = nextNode.next; 210 } 211 curNode = curNode.next; 212 } 213 } 214 /** 215 * 使用递归的方式输出链表信息 216 * @param node 217 */ 218 public void printListReversely(Node node) { 219 Node tmp=node; 220 if ( tmp!= null) { 221 printListReversely(tmp.next); 222 System.out.println("结点信息:" + tmp.data); 223 } 224 } 225 /** 226 * 启动测试 227 * @param args 228 */ 229 public static void main(String[] args) { 230 MyLinkDefin list = new MyLinkDefin(); 231 System.out.println("****加载链表数据******"); 232 list.addNode(1); 233 list.addNode(2); 234 list.addNode(3); 235 list.addNode(4); 236 list.addNode(5); 237 System.out.println("链表长度:" + list.length()); 238 System.out.println("链表-头结点-数据:" + list.head.data); 239 list.printList(); 240 241 System.out.println("删除位置索引值=4的结点:"); 242 list.delNode(4); 243 System.out.println("链表长度:" + list.length()); 244 System.out.println("链表-头结点-数据:" + list.head.data); 245 list.printList(); 246 247 248 System.out.println("删除位置索引值=1的结点:"); 249 list.delNode(1); 250 System.out.println("链表长度:" + list.length()); 251 System.out.println("链表-头结点-数据:" + list.head.data); 252 list.printList(); 253 254 System.out.println("在位置索引值=0出添加一个结点:"+6); 255 list.addNodeElem(4,6); 256 list.printList(); 257 258 int i=4; 259 System.out.println("查询条件index:"+i); 260 System.out.println("查询结果:"+list.getNodeData(i).data); 261 262 System.out.println("开始排序:正序"); 263 list.addNodeElem(3,10); 264 list.sortLinkNode(0); 265 list.printList(); 266 System.out.println("开始排序:逆序"); 267 list.addNodeElem(4,20); 268 list.sortLinkNode(1); 269 list.printList(); 270 271 System.out.println("递归的方式输出链表信息"); 272 list.printListReversely(list.getNodeData(0)); 273 } 274 }
运行结果;
****加载链表数据****** 链表长度:5 链表-头结点-数据:1 -------------------链表内容如下------------------- 1 2 3 4 5 ----------------------------------------------- 删除位置索引值=4的结点: 链表长度:5 链表-头结点-数据:1 -------------------链表内容如下------------------- 1 2 3 4 5 ----------------------------------------------- 删除位置索引值=1的结点: 链表长度:4 链表-头结点-数据:1 -------------------链表内容如下------------------- 1 2 4 5 ----------------------------------------------- 在位置索引值=0出添加一个结点:6 成功在链表尾部处添加了一个结点:6 -------------------链表内容如下------------------- 1 2 4 5 6 ----------------------------------------------- 查询条件index:4 真实查询结果:6 查询结果:6 开始排序:正序 成功在3索引处添加了一个结点:10 成功在链表尾部处添加了一个结点:10 -------------------链表内容如下------------------- 1 2 4 5 6 10 ----------------------------------------------- 开始排序:逆序 成功在4索引处添加了一个结点:20 成功在链表尾部处添加了一个结点:20 -------------------链表内容如下------------------- 20 10 6 5 4 2 1 ----------------------------------------------- 递归的方式输出链表信息 真实查询结果:20 结点信息:1 结点信息:2 结点信息:4 结点信息:5 结点信息:6 结点信息:10 结点信息:20
代码注释的应该满详细的了。
以上是关于日常学习随笔-单链表学习测试的主要内容,如果未能解决你的问题,请参考以下文章