写在前面,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,否则就等着被举报吧,尤其是那什么狗屁“金铭鼎”教育。
多有不足,欢迎评论区批评指正。