日常学习随笔-单链表学习测试

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

代码注释的应该满详细的了。

以上是关于日常学习随笔-单链表学习测试的主要内容,如果未能解决你的问题,请参考以下文章

日常学习随笔-数组单链表双链表三种形式实现队列结构的基本操作(源码注释)

日常学习随笔-数组单链表双链表三种形式实现栈结构的基本操作

每天学习亿点点系列——重温单链表

数据结构与算法系列四(单链表)

单链表的学习笔记

数据结构与算法学习——单链表相关算法