先用使用常规方法,两个指针:
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
|
type Node struct {
value int
next *Node
}
type Link struct {
head *Node
tail *Node
lenth int
}
// 向链表中添加元素
func (link *Link) add(v int ) {
if link.lenth == 0 { // 当前链表是空链表
link.head = &Node{v, nil}
link.tail = link.head
link.lenth = 1
} else {
newNond := &Node{v, nil}
link.tail.next = newNond
link.tail = newNond
link.lenth += 1
}
}
// 删除链表中的元素(双指针)
func (link *Link) remove (v int ) {
if link.lenth == 0 {
fmt.Println( "空链表,不支持该操作" )
return
}
var previous *Node = nil
for current := link.head; current != nil; current = current.next {
if current.value == v {
if current == link.head { // 要删除的是头节点
link.head = current.next
} else if current == link.tail { // 要删除的是尾节点
previous.next = nil
link.tail = previous
} else { // 要删除的是中间的节点
previous.next = current.next
}
link.lenth -= 1
break
}
previous = current
}
}
// 打印链表
func (link *Link) printList() {
if link.lenth == 0 {
fmt.Println( "空链表" )
return
}
for cur := link.head; cur != nil; cur = cur.next {
fmt.Printf( "%d " , cur.value)
}
fmt.Println()
}
|
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
|
class Node:
def __init__( self , value, next ):
self .value = value
self . next = next
def __str__( self ):
return str ( self .value)
class Link:
def __init__( self ):
self .head = None
self .tail = None
self .lenth = 0
# 向链表中添加元素
def add( self , v):
if self .lenth = = 0 : # 当前链表是空链表
self .head = Node(v, None )
self .tail = self .head
self .lenth = 1
else :
new_node = Node(v, None )
self .tail. next = new_node
self .tail = new_node
self .lenth + = 1
# 打印链表
def print ( self ):
if self .lenth = = 0 :
print ( '空链表' )
return
cur = self .head
while True :
if cur = = None :
print ()
break
print (cur, end = ' ' )
cur = cur. next
# 删除链表中的元素
def remove( self , v):
if self .lenth = = 0 :
return
cur = self .head
pre = None
while True :
if cur.value = = v:
if cur = = self .head: # 要删除的是头节点
self .head = cur. next
elif cur = = self .tail: # 要删除的是尾节点
pre. next = None
self .tail = pre
else : # 要删除的是中间的节点
pre. next = cur. next
self .lenth - = 1
break
pre = cur
cur = cur. next
if cur = = None :
print ( "未找到" , v)
break
|
只使用使用一个指针实现链表的删除:
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
|
func (link *Link) remove_with_one_pointer(v int ) {
if link.lenth == 0 {
return
}
if link.tail.value == v { // 要删除的节点是尾节点,需特殊处理
if link.lenth == 1 { // 如果链表只有一个节点
link.head = nil
link.tail = nil
} else { //大于一个节点
cur := link.head
for ; cur.next.next != nil; cur = cur.next {
} //找到尾节点的前一个节点
cur.next = nil
link.tail = cur
}
link.lenth -= 1
return
}
//要删除的节点在头部/中间 的常规情况
for cur := link.head; cur != nil; cur = cur.next {
if cur.value == v {
cur.value = cur.next.value
cur.next = cur.next.next
link.lenth -= 1
return
}
}
fmt.Println( "未找到" , v)
}
|
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
|
def remove_with_one_pointer( self , v):
if self .lenth = = 0 :
return
if self .tail.value = = v: # 要删除的节点是尾节点,需特殊处理
if self .lenth = = 1 : # 如果链表只有一个节点
self .head = None
self .tail = None
else : # 大于一个节点
cur = self .head
while True :
if cur. next . next is None : # 找到尾节点的前一个节点
break
else :
cur = cur. next
cur. next = None
self .tail = cur
self .lenth - = 1
return
# 要删除的节点在头部/中间 的常规情况
cur = self .head
while True :
if cur.value = = v:
cur.value = cur. next .value
cur. next = cur. next . next
self .lenth - = 1
break
cur = cur. next
if cur is None :
print ( '未找到' , v)
break
|
以上就是python/golang 删除链表中的元素的详细内容,更多关于python/golang 链表的资料请关注服务器之家其它相关文章!
原文链接:https://www.jianshu.com/p/8554d637702a