zoukankan      html  css  js  c++  java
  • 日常学习随笔-单链表学习测试

     今天自己自定义了一个单链表,定义了部分功能!直接贴代码吧!

    类结构图:

    详细代码如下:

      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

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

  • 相关阅读:
    请允许我们发个广告——与云共舞:以华为云精英服务商为起点开展我们的云业务团队
    【故障公告】再次出现数据库 CPU 居高不下的问题以及找到了最可能的原因团队
    【故障公告】升级阿里云 RDS SQL Server 实例故障经过团队
    【故障公告】阿里云 RDS 数据库服务器 CPU 100% 造成全站故障团队
    全网最详细的Sublime Text 3的激活(图文详解)
    全网最详细的Windows里下载与安装Sublime Text *(图文详解)
    全网最详细的大数据集群环境下多个不同版本的Cloudera Hue之间的界面对比(图文详解)
    全网最详细的Cloudera Hue执行./build/env/bin/supervisor 时出现KeyError: "Couldn't get user id for user hue"的解决办法(图文详解)
    全网最详细的大数据集群环境下如何正确安装并配置多个不同版本的Cloudera Hue(图文详解)
    Hive执行过程中出现Caused by : java.lang.ClassNotFoundException: org.cloudera.htrace.Trace的错误解决办法(图文详解)
  • 原文地址:https://www.cnblogs.com/newwind/p/9025907.html
Copyright © 2011-2022 走看看