- 以下链表类实现的功能
- 是否为空
- 链表长度
- 头部添加
- 尾部添加
- 根据指定位置添加
- 根据指定值添加
- 链表倒置
- 链表遍历
- 根据指定内容移除
class Node(object):
"""定义链表的节点类,两个属性 item:内容 next:下一节点的引用地址(也可以直接理解成下一节点对象)"""
def __init__(self, item):
self.item = item
self.next = None
class SingleLink(object):
def __init__(self):
self.__head = None
def length(self):
"""遍历链表得到链表长度"""
count = 0
cur = self.__head
while cur:
cur = cur.next
count += 1
return count
def is_empty(self):
"""判断链表是否为空"""
return self.__head is None
def travle(self):
"""遍历链表"""
cur = self.__head
while cur:
print(cur.item, end=" ")
cur = cur.next
print()
def add(self, item):
"""在链表的头 向前插入节点"""
node = Node(item)
if self.__head is None:
self.__head = node
else:
node.next = self.__head
self.__head = node
def append(self, item):
"""从链表的尾部向后添加节点"""
node = Node(item)
if self.__head is None:
self.__head = node
else:
cur = self.__head
while cur.next:
cur = cur.next
cur.next = node
def insert_by_pos(self, pos, item):
"""pos代表在第几个节点(从0开始)之后插入节点"""
if pos < 0:
self.add(item)
elif pos >= self.length():
self.append(item)
else:
count = 0
cur = self.__head
while cur.next:
if count == pos:
break
count += 1
cur = cur.next
node = Node(item)
tmp = cur.next
cur.next = node
node.next = tmp
def insert_by_value(self, value, item):
"""根据链表中的节点值,在该值后插入节点,若指定value不存在,则不插入节点"""
cur = self.__head
while cur:
if cur.item == value:
node = Node(item)
tmp = cur.next
cur.next = node
node.next = tmp
break
cur = cur.next
def remove(self, item):
"""根据节点值移除节点"""
cur = self.__head
if cur.item == item:
"""特例:若删除是头节点"""
tmp = cur
self.__head = cur.next
tmp.next = None
return
while cur.next:
if cur.next.item == item:
tmp = cur.next
cur.next = tmp.next
tmp.next = None
break
cur = cur.next
def reverse(self):
"""就地反序链表,永久更改"""
"""单项链表的倒置"""
cur = self.__head
for i in range(self.length() - 1):
tmp = cur.next
self.remove(tmp.item)
self.add(tmp.item)
def reverse2(self):
"""不使用已实现的方法,倒序"""
tmp = self.__head.next
self.__head.next = None
while tmp:
bak = tmp.next
tmp.next = self.__head
self.__head = tmp
tmp = bak
if __name__ == '__main__':
a = SingleLink()
a.add(10)
a.add(20)
a.append(200)
a.append(300)
a.insert_by_pos(102, 500)
a.insert_by_pos(5, 321)
a.insert_by_value(321, 512)
a.remove(5102)
a.travle()
print(a.length())
a.reverse()
a.travle()
print(a.length())