课时22
使用链表的过程
两个类的产生,节点类和链表类。
遍历链表。需要一个游标来帮助记录当前位置。
游标找到第一个节点,然后通过第一个节点的指向next,找到下一个节点。
因为遍历链表的第一步,需要一个游标。
那么如何使游标的移动停止呢?如何设置循环条件?
不管条件如何,首先要使计数等于0,然后每移动一个节点,加1.
而要使游标往后移,则需要在循环里面使它每次指向下面一个值。
deflengthl(self):
"""遍历整个链表"""
"""cur游标,用来移动遍历节点"""
cur=self._head
"""count记录数量"""
count = 0
while cur !=None:
count+=1
cur=cur.next
return count
而在空链表时,返回值应该为0.
def travel(self):
"""遍历整个链表"""
cur=self._head
while cur != None:
print(cur.elem)#一进入循环,就打印游标当前的东西.
cur=cur.next
class Node(object):
"""节点"""
def __init__(self,elem): #把结点保存在构造函数里."elem"是用来接受节点的。
self.elem=elem #elem保存数据
self.next=None #指向什么,一开始并不知道,所以设置为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
while cur !=None:
count+=1
cur=cur.next
return count
def travel(self):
"""遍历整个链表"""
cur=self.head
while cur != None:
print(cur.elem)#一进入循环,就打印游标当前的东西.
cur=cur.next
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
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.append(3)
ll.append(4)
ll.append(5)
ll.travel()
执行结果:
True
0
False
1
1
2
3
4
5
课时23
链表头部添加元素。
即在head与第一个节点之间插入。而新节点应该是指向none的。
为了让原有的链表结构不丢掉。
第一步应该是新节点指向原有的链表的第一个节点。
而第二步应该是让head指向新节点。
第一步。
def add(self,item):
"""链表头部添加元素"""
node=Node(item) #将item封装为一个节点
node.next=self.__head#双下划线表属性私有
self.__head=node #可以处理原有链表是空链表的情况。
class Node(object):
"""节点"""
def __init__(self,elem): #把结点保存在构造函数里."elem"是用来接受节点的。
self.elem=elem #elem保存数据
self.next=None #指向什么,一开始并不知道,所以设置为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
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
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 add(self, item):
"""链表头部添加元素"""
node = Node(item) # 将item封装为一个节点
node.next = self.__head # 双下划线表属性私有
self.__head = node # 可以处理原有链表是空链表的情况。
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)
ll.travel()
执行结果:
True
0
False
1
812345
#在头部插入了8
那么如何在任意的指定位置添加元素呢?
比如,插在第2个位置,则应该是偏移量为2的地方。
应该先找到下标所找到的位置。从头开始找。
要移动到指定位置的前一个位置,该位置可称为”pre“或”prior“。
接着改变新节点的next区域,使它指向300.
要使,pre所指的节点中的next区域指向新节点。
pre=self.__head,是指找到head所指向的节点,将该节点的位置赋值给pre,使pre指向该节点。
def insert(self,pos,item): #pos为指定的位置
"""指定位置添加元素"""
""":param pos 从0开始"""
if pos<=0:
self.add(item)#pos小于或等于零,那么就是在头部插入元素,即用头插法。
elif pos>self.lengh()-1:
self.append(item) #如果pos大于链表最后的下标,那么就是在尾部添加。
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
class Node(object):
"""节点"""
def __init__(self,elem): #把结点保存在构造函数里."elem"是用来接受节点的。
self.elem=elem #elem保存数据
self.next=None #指向什么,一开始并不知道,所以设置为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
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 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 add(self, item):
"""链表头部添加元素"""
node = Node(item) # 将item封装为一个节点
node.next = self.__head # 双下划线表属性私有
self.__head = node # 可以处理原有链表是空链表的情况。
def insert(self, pos, item): # pos为指定的位置
"""指定位置添加元素"""
""":param pos 从0开始"""
if pos <= 0:
self.add(item) # pos小于或等于零,那么就是在头部插入元素,即用头插法。
elif pos > self.length() - 1:
self.append(item) # 如果pos大于链表最后的下标,那么就是在尾部添加。
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
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)
#812345
ll.insert(-1,9) #9812345
ll.insert(3,100)#9 8 1 100 2345
ll.insert(7,200)#9 8 1 100 234 200 5
ll.travel()
执行结果:
True
0
False
1
9811002342005