循环链表就是将单链表的末尾指向其头部,形成一个环。循环链表的增删操作和单链表的增删操作
区别不大。只是增加时,需要考虑空链表增加第一个节点的特殊情况;删除时需考虑删除节点是头/尾节点,和链表中只有一个节点的特殊情况。
golang实现:
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
|
type Node struct {
value int
next *Node
}
type Circle struct {
tail *Node
lenth int
}
// 增加节点:
func (c *Circle) add(value int ) {
newNode := &Node{value, nil}
if c.lenth == 0 { //空链表中添加节点
c.tail = newNode
c.tail.next = newNode
} else {
newNode.next = c.tail.next
c.tail.next = newNode
c.tail = newNode
}
c.lenth += 1
c.printCircle()
}
// 删除节点:
func (c *Circle) remove (v int ) {
if c.lenth == 0 {
fmt.Println( "空环" )
return
} else if c.lenth == 1 && c.tail.value == v { //链表中只有一个节点的特殊情况
c.tail = nil
c.lenth = 0
c.printCircle()
return
}
pre := c.tail
cur := c.tail.next // 头节点
for i := 0; i < c.lenth; i++ {
if cur.value == v {
if cur == c.tail { //如果删除的节点是尾节点,需更新tail
c.tail = pre
}
pre.next = cur.next
c.lenth -= 1
c.printCircle()
return
}
pre = cur
cur = cur.next
}
fmt.Println(v, "不在环中" )
}
//打印节点:
func (c *Circle) printCircle() {
if c.lenth == 0 {
fmt.Println( "空环" )
return
}
cur := c.tail.next // 头节点
for i := 0; i < c.lenth; i++ {
fmt.Printf( "%d " , cur.value)
cur = cur.next
}
fmt.Println()
}
func testCircle() {
var circle *Circle = new (Circle)
//for i := 1; i <=41; i++ {
// circle.add(i)
//}
circle.add(1)
circle. remove (10)
circle.printCircle()
}
|
python实现:
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
|
class Node:
def __init__( self , value, next = None ):
self .value = value
self . next = next
def __str__( self ):
return str ( self .value)
class Circle:
def __init__( self ):
self .tail = None
self .lenth = 0
# 增加节点
def add( self , v):
new_node = Node(v)
if self .lenth = = 0 : # 空链表中添加节点
self .tail = new_node
self .tail. next = new_node
else :
new_node. next = self .tail. next
self .tail. next = new_node
self .tail = new_node
self .lenth + = 1
# 删除节点
def remove( self , v):
if self .lenth = = 0 :
print ( "空环" )
return
elif self .lenth = = 1 and self .tail.value = = v: # 链表中只有一个节点的特殊情况
self .tail = None
self .lenth = 0
return
pre = self .tail
cur = self .tail. next # 头节点
for i in range ( self .lenth):
if cur.value = = v:
if cur = = self .tail: # 如果删除的节点是尾节点,需更新tail
self .tail = pre
pre. next = cur. next
self .lenth - = 1
return
pre = cur
cur = cur. next
print (v, "不在环中" )
# 打印链表
def print_circle( self ):
if self .lenth = = 0 :
print ( '空环' )
return
cur = self .tail. next # 头节点
for i in range ( self .lenth):
print (cur, end = " " )
cur = cur. next
print ()
def test():
c = Circle()
for i in range ( 10 ):
c.add(i)
c.print_circle()
c.remove( 0 )
c.print_circle()
c.remove( 10 )
c.print_circle()
c.remove( 9 )
c.print_circle()
c.remove( 4 )
c.print_circle()
|
以上就是python/golang实现循环链表的示例代码的详细内容,更多关于python/golang 循环链表的资料请关注服务器之家其它相关文章!
原文链接:https://www.jianshu.com/p/73095503dfdd