第三章 双向链表(二)
1.后继节点:当前节点的下一个节点。
前驱节点:当前节点的前一个节点。
2.双向链表的构成:每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。这里的前驱节点的链接区prev可以代替单链表的双游标的其中一个Pre。然后这里的后继节点的链接区next与迭代式生成器逐个读取元素的操作__next__()无关联。
3.双链表中对应节点与链表的实现(注意:在进行下边的面向双链表节点与链表对象类的编写时,一定要画图分析,并重点考虑空表、只有一个节点、尾结点的情况是否符合):
双链表的节点较普通单链表多一个参数,就是前驱节点的链接取区。这种链表支持的操作仍旧与单链表相同,包括:is_empty() 链表是否为空;length() 链表长度;travel() 遍历链表;add(item) 链表头部添加;;append(item) 链表尾部添加;insert(pos, item) 指定位置添加;remove(item) 删除节点;search(item) 查找节点是否存在。
# -*- coding:utf-8 -*-
class Node():
def __init__(self,elem):
self.elem=elem
self.next=None
self.prev=None
class DoubleLinkList():
def __init__(self,node=None):
self.__head=node
def is_empty(self):
return self.__head==None
def length(self):
count=0
cur=self.__head
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,elem):
node=Node(elem)
if self.is_empty()==True:
self.__head=node
else:
node.next=self.__head
self.__head.prev=node
self.__head=node
def append(self,elem):
node=Node(elem)
if self.is_empty()==True:
self.__head=node
else:
cur = self.__head
while cur.next!=None:
cur=cur.next
node.prev=cur
cur.next=node
def insert(self,pos,elem):
if pos<=0:
return self.add(elem)
elif pos>self.length()-1:
return self.append(elem)
else:
num=0
cur=self.__head
node=Node(elem)
while num<pos-1:
num+=1
cur=cur.next
node.prev=cur
node.next=cur.next
cur.next=node
cur.next.prev=node
def search(self,elem):
cur=self.__head
while cur!=None:
if cur.elem==elem:
return True
cur=cur.next
return False
def remove(self,elem):
cur=self.__head
if self.__head!=None:
if self.__head.next!=None:
while cur!=None:
if cur.elem==elem:
if cur==self.__head:
self.__head=cur.next
elif cur.next==None:
cur.prev.next=None
else:
cur.prev.next=cur.next
cur.next.prev=cur.prev
break
else:
cur=cur.next
else:
if cur.elem==elem:
self.__head = cur.next
if __name__=='__main__':
ll = DoubleLinkList()
ll.add(1)
ll.add(2)
ll.append(3)
ll.insert(2, 4)
ll.insert(4, 5)
ll.insert(0, 6)
print( "length:", ll.length())
ll.travel()
print(ll.search(3))
print(ll.search(7))
ll.remove(1)
print( "length:", ll.length())
ll.travel()
ll.remove(6)
print("length:", ll.length())
ll.travel()
ll.remove(5)
print("length:", ll.length())
ll.travel()
ll.remove(4)
print("length:", ll.length())
ll.travel()
ll.remove(3)
print("length:", ll.length())
ll.travel()
ll.remove(3)
print("length:", ll.length())
ll.travel()
ll.remove(2)
print("length:", ll.length())
ll.travel()
第三章 单向循环链表(三)
1.单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
2.单向循环链表中对应节点与链表的实现:这种链表支持的操作仍旧与单链表相同,包括:is_empty() 链表是否为空;length() 链表长度;travel() 遍历链表;add(item) 链表头部添加;;append(item) 链表尾部添加;insert(pos, item) 指定位置添加;remove(item) 删除节点;search(item) 查找节点是否存在。
# -*- coding:utf-8 -*-
class Node():
def __init__(self,elem):
self.elem=elem
self.next=None
class SingleCycleLinkList():
def __init__(self):
self.__head=None
def is_empty(self):
return self.__head==None
def length(self):
if self.is_empty()==True:
return 0
num = 0
cur = self.__head
while cur.next!=self.__head:
num+=1
cur=cur.next
return num+1
def travel(self):
cur=self.__head
if self.is_empty()!=True:
while cur.next!=self.__head:
print(cur.elem,end=' ')
cur=cur.next
print(cur.elem)
def add(self,elem):
node=Node(elem)
cur=self.__head
if self.is_empty()==True:
self.__head=node
node.next=node
else:
while cur.next!=self.__head:
cur=cur.next
node.next=self.__head
cur.next=node
self.__head=node
def append(self,elem):
node = Node(elem)
cur = self.__head
if self.is_empty() == True:
self.__head = node
node.next = node
else:
while cur.next!=self.__head:
cur = cur.next
node.next = self.__head
cur.next = node
def insert(self,pos,elem):
if pos<=0:
return self.add(elem)
elif pos>self.length()-1:
return self.append(elem)
else:
num=0
node=Node(elem)
cur=self.__head
while num<pos-1:
cur=cur.next
num=num+1
node.next=cur.next
cur.next=node
def search(self,elem):
cur=self.__head
if self.is_empty()==True:
return True
else:
while cur.next!=self.__head:
if cur.elem==elem:
return True
else:
cur=cur.next
if cur.elem==elem:
return True
else:
return False
def remove(self,elem):
if self.__head!=None:
if self.__head.next!=self.__head:
pre=None
cur=self.__head
while cur.next!=self.__head:
if cur.elem==elem:
if cur==self.__head:
while cur.next != self.__head:
cur=cur.next
cur.next=self.__head.next
self.__head=self.__head.next
return
else:
pre.next=cur.next
return
pre=cur
cur=cur.next
if cur.elem == elem:
pre.next=self.__head
else:
if self.__head.elem==elem:
self.__head=None
if __name__ == "__main__":
ll = SingleCycleLinkList()
ll.add(1)
ll.add(2)
ll.append(3)
ll.insert(2, 4)
ll.insert(4, 5)
ll.insert(0, 6)
print( "length:",ll.length())
ll.travel()
print(ll.search(3))
print(ll.search(7))
ll.remove(1)
print("length:",ll.length())
ll.travel()
ll.remove(5)
print("length:", ll.length())
ll.travel()
ll.remove(6)
print("length:", ll.length())
ll.travel()
ll.remove(2)
print("length:", ll.length())
ll.travel()
ll.remove(3)
print("length:", ll.length())
ll.travel()
ll.remove(3)
print("length:", ll.length())
ll.travel()
ll.remove(4)
print("length:", ll.length())
ll.travel()