Java數據結構——循環鏈表

www.cnblogs.com/ericz2j/p/1…

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();
}
}
相關文章
相關標籤/搜索