线性表 - 单向循环链表
# 概念
将单链表中最后一个结点的指针域由空改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。
# 单向循环链表实现
单循环链表和单向链表的最大区别就是最后一个结点的指针域要指向头结点。所以需要在插入的时候特殊处理,查找和删除基本不变。
# 插入结点
public boolean insert(Object obj, int i) {
if (i < 0 || i > size) {
System.out.println("插入位置不正确");
return false;
}
Node s = new Node(obj);
Node p = head;
if (size == 0) {
s.next = head;
head.next = s;
}
for (int j = 0; j < i; j++) {
p = p.next;
}
s.next = p.next;
p.next = s;
size++;
return true;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 删除结点
public Node remove(int i) {
if (i < 0 || i > size - 1) {
System.out.println("删除位置不正确");
return null;
}
Node p = head;
for (int j = 0; j < i; j++) {
p = p.next;
}
// 找到了
Node t = p.next;
p.next = p.next.next;
size--;
return t;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查找结点
public Object search(int i) {
Node p = head;
// i 有可能为0
for (int j = 0; j <= i; j++) {
p = p.next;
}
if (p == null) {
return -1;
} else {
return p.data;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 完整代码
package com.sqlboy.lineartable;
public class CycleLinkList {
// 头结点
private Node head;
// 结点数
private int size;
public CycleLinkList() {
head = new Node();
}
/**
* 打印链表
*/
public void show() {
Node node = head.next;
for (int i = 0; i < size; i++) {
System.out.println(node.data + ", next " + node.next.data);
node = node.next;
}
System.out.println();
}
/**
* 插入元素
*
* @param obj
* @param i
* @return
*/
public boolean insert(Object obj, int i) {
if (i < 0 || i > size) {
System.out.println("插入位置不正确");
return false;
}
Node s = new Node(obj);
Node p = head;
if (size == 0) {
s.next = head;
head.next = s;
}
for (int j = 0; j < i; j++) {
p = p.next;
}
s.next = p.next;
p.next = s;
size++;
return true;
}
/**
* 按位置删除元素
*
* @param i
* @return
*/
public Node remove(int i) {
if (i < 0 || i > size - 1) {
System.out.println("删除位置不正确");
return null;
}
Node p = head;
for (int j = 0; j < i; j++) {
p = p.next;
}
// 找到了
Node t = p.next;
p.next = p.next.next;
size--;
return t;
}
/**
* 按位置查找
*
* @param i
* @return
*/
public Object search(int i) {
Node p = head;
// i 有可能为0
for (int j = 0; j <= i; j++) {
p = p.next;
}
if (p == null) {
return -1;
} else {
return p.data;
}
}
public static void main(String[] args) {
CycleLinkList list = new CycleLinkList();
list.insert(new Integer(0), 0);
list.insert(new Integer(1), 1);
list.insert(new Integer(2), 2);
list.show();
list.insert(new Integer(200), 2);
list.show();
list.insert(new Integer(3), 3);
list.show();
list.remove(4);
list.show();
System.out.println(list.search(3));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
上次更新: 2023/11/01, 03:11:44