链表

  1. 单向链表
    1. 节点实现
    2. 单链表的操作

单向链表

单向链表也叫单链表,是链表中最简单的一种形式,他的每一个节点包含两个域,一个信息域和一个链接域。这个链表指向链表中的下一个节点,而最后一个节点的链接域则执行一个空值。

节点实现

单链表的操作

  • is_empty()链表是否为空
  • length()链表的长度
  • travel()遍历整个链表
  • add(item)链表头部添加元素
  • append(item)链表尾部添加元素
  • insert(ops, item)指定位置添加元素
  • remove(item)删除节点
  • seach(item)查找节点是否存在
  1. _x:单前置下划线,私有化属性或方法,禁止通过form modules import * 导入,但是类和对象可以访问
  2. __xx :双前置下划线,避免与子类中的属性名冲突,无法在外部直接访问(名字重整所以访问不到),类对象和子类不能访问
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
124
125
126
127
128
129
130
131
# coding: utf-8


class Node(object):
"""单链表的节点"""
def __init__(self, elem):
self.elem = elem
self.next = None


class SingleLinkList(object):
"""单链表"""
def __init__(self, node=None):
self.__head = node # ****定义成私有的

def is_empty(self):
"""链表是否为空"""
return self.__head is None

def length(self):
"""链表长度"""
# cut游标,用来移动遍历结点
cur = self.__head
# count 记录数量
count = 0 # 注意这个是0
while cur is not None: # 不用cur.next,用的话最后一个就直接跳出,不执行加1了
count += 1
cur = cur.next
return count

def travel(self):
"""遍历整个链表"""
cur = self.__head
while cur is not None:
print(cur.elem, end=" ")
cur = cur.next

def add(self, item):
"""链表表头添加,头插法"""
node = Node(item)
node.next = self.__head # 不是self.__head.next,__head存放的是下一个的地址,所以可以直接等于
self.__head = node

def append(self, item):
"""尾插法"""
node = Node(item)
cur = self.__head # 从头往后走,走到最后
if self.__head is None: # 判断是否为空
self.__head = node
else:
while cur.next is not None: # 用的是cur.next
cur = cur.next # 往后移动
cur.next = node

def insert(self, pos, item):
"""指定位置添加元素
:param pos: 从0开始
:param item:
"""
if pos <= 0:
self.add(item)
elif pos > self.length()-1:
self.append(item)
else:
prior = self.__head # 直接去找指的,不是__head
count = 0
while count < pos-1: # 不是小于等于,寻找前一个节点
prior = prior.next
count += 1
# 当循环退出后,prior指向pos - 1位置
node = Node(item)
node.next = prior.next
prior.next = node

def remove(self, item):
"""删除结点
:param item:00
"""
prior = None
cur = self.__head
while cur is not None:
if cur.elem == item:
# 先判断是否是头结点
if cur is self.__head:
self.__head = cur.next
else:
prior.next = cur.next
# del cur
print("删除%d成功" % item)
break
else:
prior = cur
cur = cur.next
else:
print("没有这个元素,删除失败")

def search(self, item):
cur = self.__head
count = 0
if cur is None:
return print("空的,查找%d失败" % item)
else:
while cur is not None: # 是cur不是cur.next
if cur.elem == item:
return count
else:
cur = cur.next
count += 1
print("查找%d失败,没有这个元素" % item)


if __name__ == '__main__':
ll = SingleLinkList()
print(ll.is_empty())

print(ll.length())
ll.add(0)
ll.append(1)
ll.append(2)
ll.append(5)
ll.append(3)
ll.add(20)
# 20 0 1 2 5 3
ll.insert(-1, 9)
ll.insert(3, 90)
# 9 20 0 90 1 2 5 3
ll.travel()
print("\n********************")
ll.search(3233)
ll.remove(5)
ll.travel()

转载请注明来源,欢迎指出任何有错误或不够清晰的表达。可以邮件至gxnucgb@qq.com

文章标题:链表

文章字数:787

本文作者:陈桂彬

发布时间:2019-08-11, 13:34:16

最后更新:2019-08-12, 12:18:41

原始链接:https://github.com/gxnucgb/gxnucgb.github.io/2019/08/11/链表/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

github