仔细仔细理解单链表各种操作的程序
#单链表的构造
#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==None
def length(self):
'''链表长度'''
# cur游标,用来移动遍历节点
cur = self.__head
# count记录数量
count = 0#一定要设置为0,满足空链表特殊情况
while cur != None:
count += 1
cur = cur.next
return count
def travel(self):
'''遍历整个列表'''
cur=self.__head
while cur!=None:
print(cur.elem,end=" ")
cur=cur.next
print()
def add(self,item):
'''链表头部添加元素,头插法'''
node=Node(item)
node.next=self.__head
self.__head=node
def append(self,item):
'''链表尾部添加元素,尾插法'''
node=Node(item)
if self.is_empty():
self.__head=node
else:
cur = self.__head
while cur.next != None:
cur = cur.next
cur.next = node
def insert(self,pos,item):
'''指定位置添加元素
pos从0开始索引'''
if pos<=0:
self.add(item)
elif pos>(self.length()-1):
self.append(item)
else:
pre = self.__head
count = 0
while count < (pos-1):
count += 1
pre = pre.next
# 当循环退出后,pre指向pos-1位置
node = Node(item)
node.next = pre.next
pre.next = node
def remove(self,item):
'''删除节点'''
cur=self.__head
pre=None
while cur!=None:
if cur.elem==item:
#先判断此节点是否是头节点
#头节点
if cur==self.__head:
self.__head=cur.next
else:
pre.next=cur.next
break
else:
pre=cur
cur=cur.next
def search(self,item):
'''查找节点是否存在'''
cur=self.__head
while cur !=None:
if cur.elem == item:
return True
else:
cur = cur.next
return False
if __name__=='__main__':
ll=SingleLinkList()
print(ll.is_empty())
print(ll.length())
ll.append(1)
print(ll.is_empty())
print(ll.length())
ll.append(2)
ll.add(8)
ll.append(3)
ll.append(4)
ll.append(5)
#8 1 2 3 4 5
ll.insert(-1,9)#9 8 1 2 3 4 5
ll.travel()
ll.insert(3,100)#9 8 1 100 2 3 4 5
ll.travel()
ll.insert(10,200)#9 8 1 100 2 3 4 5 200
ll.travel()
ll.remove(100)
ll.travel()
ll.remove(9)
ll.travel()
ll.remove(200)
ll.travel()
方法流程图
头插法
指定位置插入元素
移除元素
链表与顺序表的对比
链表失去了顺序表随机读取的优点,同时链表由于增加了节点的指针域,空间开销比较大,但对存储空间的使用相对灵活。
链表:可以在离散的内存空间灵活使用、友好存在。
顺序表:必须是顺序结构,如果要存储较大的数据,则会占用过多空间。