单向链表的简单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,否则就等着被举报吧,尤其是那什么狗屁“金铭鼎”教育。

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

原文地址:https://www.cnblogs.com/sunziren/p/10254481.html