• 单向链表的简单Java实现-sunziren


      写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起。


      最近面试的过程中,发现有的公司的面试题考到了链表的逆序,这一块我正好不是特别清楚。于是打算把链表这一块好好的学习学习。在网上搜寻了众多的资料以后,了解到链表的核心是节点与节点之间的互相链接。

      于是自己也写了一个单向链表的类,里面包括input插入方法,inputById按指定下标插入方法,deleteAll删除所有节点方法,deleteById按指定下标删除结点方法,showAll控制台查看所有元素方法,reverse反转当前链表方法,length获取当前链表长度方法,等基本方法。

      需要说明的是,这个类还有很多不足之处,它还有很多需要改进的地方。但是基本原理和单向链表是相同的,仅供参考。

      1 package demo_4;
      2  
      3 import java.util.Stack;
      4  
      5 public class MyList<Re_Helix> {
      6     //节点内部类;
      7     private class Node{
      8         private Re_Helix data;            //数据;
      9         private Node next = null;            //下个节点的引用;
     10         
     11         public Node() {         //节点的无参构造;
     12             super();
     13         }
     14         
     15         public Node(Re_Helix data) {         //节点的有参构造;
     16             super();
     17             this.data = data;
     18         }
     19     }
     20     
     21     private Node head;            //头部节点;
     22     private Node end;            //尾部节点;
     23     private Node point;            //临时节点;
     24     private int length;            //长度属性;
     25     
     26     public MyList() {            //链表的无参构造;
     27         head = new Node();
     28         end = head;
     29         length = 0;
     30     }
     31     
     32     public void input(Re_Helix data) {            //给链表插入新值;
     33         point = new Node(data);
     34         if(length==0) {
     35             end.data = point.data;
     36         }else {
     37             end.next = point;
     38             end = point;
     39         }
     40         length++;
     41     }
     42     
     43     public void inputById(int target,Re_Helix data) {            //在指定下标的位置插入新值,如果两端超出范围,则分别按照head和end处理;
     44         Node temp = new Node(data);
     45         if(target>=length) {
     46             end.next = temp;
     47             end = temp;
     48         }else if(target<=0) {
     49             temp.next = head;
     50             head = temp;
     51         }else {
     52             temp.next = packPoint(target);
     53             packPoint(target-1).next = temp;
     54         }
     55         length++;
     56     }
     57     
     58     public int length() {            //返回链表的长度;
     59         return length;
     60     }
     61     
     62     public Re_Helix getById(int target) {            //输入下标返回值;
     63         return packPoint(target).data;
     64     }
     65     
     66     public void showAll() {            //在控制台查看当前链表中的所有数据
     67         point = head;
     68         int i = 0;
     69         while(point!=null) {
     70             System.out.println("第"+(i++)+"个:"+point.data);
     71             point = point.next;
     72         }
     73     }
     74     
     75     public void reverse() {            //将链表反转;
     76         Stack<Node> s1 = new Stack<Node>();            //利用队列的先进先出的特性;
     77         point = head;
     78         while(point!=null) {
     79             s1.push(point);
     80             point = point.next;
     81         }
     82         head = s1.pop();
     83         point = head;
     84         while(!s1.isEmpty()) {
     85             point.next = s1.pop();
     86             point = point.next;
     87         }
     88         end = point;
     89         end.next = null;  //要将逆序后的end位置节点的next置空,不然会造成最后两位的循环;
     90     }
     91     
     92     public void deleteById(int target) {            //输入下标删除值
     93         if(target>0) {
     94             packPoint(target-1).next = packPoint(target).next;
     95         }else {
     96             head = head.next;
     97         }
     98         length--;
     99     }
    100     
    101     public void deleteAll() {            //清空链表;
    102         length = 0;
    103         head.data = null;
    104         head.next = null;
    105         point = null;
    106         end = head; 
    107         System.gc();
    108     }
    109     
    110     public boolean editById(int target,Re_Helix data) {            //修改传入下标位置的值;
    111         if(target<0 || target>length) {
    112             return false;
    113         }else {
    114             packPoint(target).data = data;
    115             return true;
    116         }
    117     }
    118     
    119     private Node packPoint(int target) {            //内部方法,将指针指向指定下标的节点;
    120         if(target<=0) {
    121             point = head;
    122         }else if(target>=length) {
    123             point = end;
    124         }else {
    125             int i = 0;
    126             point = head;
    127             while(i++!=target) {
    128                 point = point.next;
    129             }
    130         }
    131         return point;
    132     }
    133 }

      本文为我的原创文章,转载必须注明链接和我的ID:sunziren,否则就等着被举报吧,尤其是那什么狗屁“金铭鼎”教育。

      多有不足,欢迎评论区批评指正。

  • 相关阅读:
    Mybatis集成dbcp-java.lang.AbstractMethodError: Method org/apache/commons/dbcp/DelegatingResultSet.isClosed()Z is abstract
    Word 错误提示“此功能看似已中断,并需要修复” 解决
    解决 org.springframework.context.annotation.ConflictingBeanDefinitionException
    IDEA中的JAVA WEB项目启动报错的定位方法
    Oracle数据库中包含CLOB字段表的导出和导入
    idea terminal修改为gitbash多彩
    企业微信如何发红包 企业微信向个人发红包 企业微信群无法发红包 企业微信无法发红包 企业微信无法发红包如何解决
    vue项目中使用ts(typescript)入门教程
    svg / d3-force 中如何给link的label文字加底色
    svg 如何使用滤镜给文字加底色
  • 原文地址:https://www.cnblogs.com/sunziren/p/10254481.html
Copyright © 2020-2023  润新知