1、單向循環鏈表
表中的最後一個節點的指針域指向頭結點,整個鏈表造成一個環。其餘的與單鏈表相同。html
(如下圖片均來自網絡,侵刪)node
插入操做網絡
刪除操做dom
簡單實現ide
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
|
public
class
CiNode {
private
Object data;
private
CiNode next;
private
static
CiNode first;
// 臨時結點,頭結點,並非鏈表裏想要的值,起到標記鏈表頭的做用
public
CiNode() {
super
();
}
public
CiNode(Object data, CiNode next) {
super
();
this
.data = data;
this
.next = next;
}
public
Object getData() {
return
data;
}
public
void
setData(Object data) {
this
.data = data;
}
public
CiNode getNext() {
return
next;
}
public
void
setNext(CiNode next) {
this
.next = next;
}
public
static
void
add(CiNode node,
int
index) {
if
(index ==
0
) {
node.next = first.next;
first.next = node;
}
else
{
int
temp =
0
;
for
(CiNode n = first.next;; n = n.next) {
temp++;
if
(temp == index) {
node.next = n.next;
n.next = node;
break
;
}
}
}
}
public
static
void
remove(
int
index) {
if
(index %
5
==
0
) {
// 刪除第一個元素,考慮循環
first.next = first.next.next;
}
else
{
int
temp =
0
;
for
(CiNode n = first.next;; n = n.next) {
if
(n == first) {
temp -=
1
;
// 減一是由於鏈表循環計數時會把first記一次,因此這裏減一次,使下標一致
}
temp++;
if
(temp == index) {
n.next = n.next.next;
break
;
}
}
}
}
public
static
void
display() {
for
(CiNode n = first.next; n != first; n = n.next) {
System.out.print(n.data +
" "
);
}
System.out.println();
}
public
static
void
main(String[] args) {
CiNode node4 =
new
CiNode(
"ddd"
,
null
);
CiNode node3 =
new
CiNode(
"ccc"
, node4);
CiNode node2 =
new
CiNode(
"bbb"
, node3);
CiNode node1 =
new
CiNode(
"aaa"
, node2);
first =
new
CiNode(
null
, node1);
node4.next = first;
System.out.println(
"當前鏈表:"
);
display();
add(
new
CiNode(
"eee"
,
null
),
5
);
// 傳5進去是爲了體現循環,當參數大於了鏈表長度時,又回到first
System.out.println(
"插入後鏈表:"
);
display();
remove(
11
);
System.out.println(
"刪除後鏈表:"
);
display();
}
}
|
循環單鏈表模擬擊鼓傳花遊戲this
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
|
public
class
JiGuChuanHua
implements
Runnable {
private
Object person;
//遊戲的人的data
private
JiGuChuanHua next;
//指向下一我的,
private
static
JiGuChuanHua first;
//第一我的
public
JiGuChuanHua() {
super
();
}
//構造方法
public
JiGuChuanHua(Object person, JiGuChuanHua next) {
super
();
this
.person = person;
this
.next = next;
}
@Override
public
void
run() {
JiGuChuanHua loser = first;
//以第一我的爲起點
double
time = (Math.random() +
0.5
) *
10
;
//隨機產生遊戲時間(5-15s)
boolean
flag =
true
;
//結束線程的標誌
System.out.println(
"本局遊戲時間:"
+ time +
"s"
);
System.out.println(
"遊戲開始:"
);
System.out.println(loser.person);
//初始遊戲時,花在第一我的手上,打印
double
startTime = System.currentTimeMillis();
//獲取開始遊戲的時間
while
(flag) {
for
(JiGuChuanHua node = first;; node = node.next) {
loser = node.next;
//loser指向下一我的,模擬傳花過程
System.out.println(loser.person);
//打印拿到花的人
try
{
Thread.sleep((
long
) (Math.random() *
500
));
//線程睡眠,模擬花在每個人手中停留時間
}
catch
(InterruptedException e) {
e.printStackTrace();
}
double
endTime = System.currentTimeMillis();
//傳完一我的時的時間
if
(endTime - startTime >= time *
1000
) {
//遊戲時間到,這裏不具有原子性,因此是大於等於
flag =
false
;
//標誌位置爲false
break
;
}
}
}
System.out.println(
"遊戲結束,拿到花的人是:"
+ loser.person);
//打印最後拿到花的人
}
public
static
void
main(String[] args) {
//將參加遊戲的人用鏈表連起來,構成一個循環
JiGuChuanHua person5 =
new
JiGuChuanHua(
"e"
,
null
);
JiGuChuanHua person4 =
new
JiGuChuanHua(
"d"
, person5);
JiGuChuanHua person3 =
new
JiGuChuanHua(
"c"
, person4);
JiGuChuanHua person2 =
new
JiGuChuanHua(
"b"
, person3);
JiGuChuanHua person1 =
new
JiGuChuanHua(
"a"
, person2);
person5.next = person1;
first = person1;
JiGuChuanHua jgch =
new
JiGuChuanHua();
Thread thread =
new
Thread(jgch);
thread.start();
//開啓線程
}
}
|
2、雙向循環鏈表
從雙向鏈表中的任意一個結點開始,均可以很方便地訪問它的前驅結點和後繼結點。通常咱們都構造雙向循環鏈表。線程
插入操做指針
刪除操做code
簡單實現cdn
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
|
public
class
CiDlNode {
private
Object data;
private
CiDlNode next;
private
CiDlNode prev;
private
static
CiDlNode first;
public
CiDlNode() {
super
();
}
public
CiDlNode(Object data, CiDlNode next, CiDlNode prev) {
super
();
this
.data = data;
this
.next = next;
this
.prev = prev;
}
public
static
void
insert(Object data,
int
index) {
CiDlNode node =
new
CiDlNode(data,
null
,
null
);
if
(index ==
0
) {
node.next = first.next;
first.next.prev = node;
first.next = node;
node.prev = first;
}
else
{
int
temp =
0
;
for
(CiDlNode n = first.next;; n = n.next) {
temp++;
if
(temp == index) {
node.next = n.next;
node.next = n.next;
n.next.prev = node;
n.next = node;
node.prev = n;
break
;
}
}
}
}
public
static
void
remove(Object data) {
for
(CiDlNode n = first.next; n != first; n = n.next) {
if
(n.data.equals(data)) {
n.prev.next = n.next;
n.next.prev = n;
}
}
}
public
static
void
print() {
for
(CiDlNode node = first.next; node != first; node = node.next) {
System.out.print(node.data +
" "
);
}
System.out.println();
}
public
static
void
main(String[] args) {
first =
new
CiDlNode(
"0"
,
null
,
null
);
CiDlNode node1 =
new
CiDlNode(
"aaa"
,
null
, first);
CiDlNode node2 =
new
CiDlNode(
"bbb"
,
null
, node1);
CiDlNode node3 =
new
CiDlNode(
"ccc"
,
null
, node2);
CiDlNode node4 =
new
CiDlNode(
"ddd"
, first, node3);
node3.next = node4;
node2.next = node3;
node1.next = node2;
first.next = node1;
System.out.println(
"當前鏈表:"
);
print();
insert(
"ddd"
,
5
);
System.out.println(
"插入後鏈表:"
);
print();
remove(
"ddd"
);
System.out.println(
"刪除後鏈表:"
);
print();
}
}
|