Java实现单链表
刚开始学习java不久的时候以为java没有指针。。。不知道怎么弄链表,最近才顿悟完成这个简单的链表。。。实现这个链表类让我感觉面向对象思想更进一步,建议自己看了思路自己做。(我就是o(^▽^)o)
java中有基本数据类型和引用数据类型(其实就是指针)。如果对引用不够了解请访问 http://zwmf.iteye.com/blog/1738574 (我觉得写得特别好,就没必要重复了)。
实现链表的思路:
1)链表类,结点类(链表类的内部类),在main()方法创建一条链表类对象,通过方法逐步创建结点类,通过引用链接起来成为链表。
2)结点类包含数据和对下个结点的引用,以及可以对数据赋值的构造函数。
3)链表类的构造方法,只构造出不含数据的头结点。(外部类可以直接对内部类的私有成员进行访问,这样就可以直接修改引用)
主体代码:
1 public class MyLink<E>{2 private class Node{
3 privare Object data; //保存数据
4 private Node next; //对下个结点的引用
5 }
6 }
MyLink
完整版代码(链表下标从0开始):
1 package myLink;2
3 public class MyLink<E> { //使用泛型是为了使用时候可以规范链表的数据类型
4 // 结点内部类
5 private class Node {
6 private Object data; //数据
7 private Node next = null; //指向下个结点的引用
8
9 public Node() { //无参数构造函数为了创建头结点服务
10 data = null;
11 }
12
13 public Node(E data) { //带数据的构造函数
14 this.data = data;
15 }
16
17 }
18
19 private Node head; // 头引用(指针)
20 private Node rear; // 尾引用(指针)
21 private Node point; //临时引用(指针)
22 private int length; // 链表长度
23
24 public MyLink() { //链表构造函数,创建无数据的头结点
25 head = new Node();
26 rear = head;
27 length = 0;
28 }
29
30 /**
31 * 从尾部插入链表
32 *
33 */
34 public void add(E elem) {
35 point = new Node(elem);
36 rear.next = point;
37 rear = point;
38 length++;
39
40 }
41
42 /**
43 * 遍历输出链表
44 */
45 public void traverse() {
46 point = head; //移动临时引用到头结点
47 if (head != null)
48 System.out.print("[" + head.data + "]");
49 while (point.next != null) {
50 System.out.print("-➜[" + point.next.data + "]");
51 point = point.next;
52 }
53 System.out.println();
54 }
55
56 /**
57 * 获得链表长度
58 *
59 */
60 public int length() {
61 return length;
62 }
63
64 /**
65 * 清除链表内容
66 * (java垃圾回收,当对象没有引用指向,则视为垃圾,清理时机由系统决定)
67 */
68 public void clear() {
69 while (head.next != null) {
70 head.next = head.next.next;
71 }
72 rear = head; // 回到初始状态
73 point = null;
74 length = 0;
75 System.gc(); //请求系统清理垃圾,未必有用
76 }
77
78 /**
79 * 在指定个位置插入元素成为第p个元素
80 */
81 public void insert(int position, E elem) {
82 if(position>=0 && position<=length){
83 point = movePoint(position);
84 Node tmp = new Node(elem);
85 tmp.next = point.next;
86 point.next = tmp;
87 length++;
88 }else{
89 System.out.println("没有指定位置,插入失败")
90 }
91
92 }
93
94 /**
95 * 删除指定位置的元素
96 */
97 public void remove(int position) {
98 if (position >= 0 && position < length) {
99 point = movePoint(position);
100 Node tmp = point.next;
101 point.next = tmp.next;
102 length--;
103 } else {
104 System.out.println("删除失败,没有指定位置元素");
105 }
106 }
107
108 /**
109 * 更改指定位置的元素
110 */
111 public void set(int position, E elem) {
112 if (position >= 0 && position < length) {
113 point = movePoint(position);
114 point.next.data = elem;
115 } else {
116 System.out.println("修改失败,没有指定位置元素");
117 }
118 }
119
120 /**
121 * 移动指针到指定位置
122 * 私有方法,供其它方法使用
123 */
124 private Node movePoint(int position) {
125 if (position < 0) //如果参数小于零,则移动到头部,本来是为了规避参数错误问题,但在使用此方法的其他方法皆有做其他处理,可删除
126 return head;
127 if (position > length) //如果参数大于长度,则移动到尾部,同上,可删除
128 return rear;
129
130 if (position >= 0 && position <= length) {
131 point = head;
132 while (point != null) {
133 if (position == 0)
134 break;
135 position--;
136 point = point.next;
137 }
138 }
139
140 return point;
141
142 }
143
144 /**
145 * 连接两条链表
146 * 已知问题,两链表的数据类型不一定相同,凭我目前实力无法理解解决(如何获取泛型实际类型)
147 */
148 public void connect(MyLink b) {
149 this.rear.next = b.head.next;
150 this.length += b.length;
151 b.head = null;
152 }
153
154 /**
155 * 按下标查找
156 */
157 public E find(int position) {
158 if (position >= 0 && position < length) {
159 Node tmp = movePoint(position);
160 return (E) tmp.next.data;
161 }
162 return null;
163 }
164
165 /**
166 * 查找元素的值,返回下标
167 */
168 public int search(E elem) {
169 point = head.next;
170 int idex = -1;
171 while (point != null) {
172 idex++;
173 if (point.data == elem)
174 break;
175 point = point.next;
176 }
177 return idex;
178
179 }
180 }
View Code
撰写时间:2017-07-27 21:03:19
修改时间:
感觉有些地方处理的不好,很粗糙,将来慢慢改进吧。
若代码有什么不足,不吝赐教。
以上是 Java实现单链表 的全部内容, 来源链接: utcz.com/z/394772.html