链表
链表:通过指针对每个元素进行存储
1 #假设无序双向链表 2 class Node: 3 def __init__(self, prev, next, key): 4 '''节点(前继,后继,关键字)''' 5 self.prev = prev 6 self.next = next 7 self.key = key 8 9 class DoubleLinkedList: 10 '''无序双链表''' 11 def __init__(self,A): 12 '''根据头指针初始化一个空链表,再通过给定的数据把数据加入到链表中,通过列表属性反映链表''' 13 self.head = None 14 self.list=[] 15 A.reverse() 16 for i in A: 17 node=Node(None,None,i) 18 self.list_insert(node) 19 20 21 def list_search(self, k): 22 '''链表的搜索:从第一个节点开始依次与关键值k比较,如果不是,节点后移,返回搜索到的节点''' 23 x = self.head 24 while x != None and x.key != k: 25 x = x.next 26 return x 27 28 def list_insert(self, x): 29 '''链表的插入,头插法:如果头指针不为None则把x设为头结点的前继节点 30 再把头指针指向x,此时把x的前继置为None''' 31 x.next = self.head 32 if self.head != None: 33 self.head.prev = x 34 self.head = x 35 x.prev = None 36 self.list.append(x.key) 37 38 def list_delete(self, x): 39 '''链表的删除:如果节点的前继不为None(表示x前面有人), 40 就把原来(x指向x后继)变为现在(x的前继指向x的后继),删除了x的前继指向x的指针 41 否则(相当于x为头结点)就把头指针指向x的后继, 42 如果x存在后继(x不是尾节点)就把原来(x指向x前继)变为(x后继指向x前继),''' 43 if x.prev != None: 44 x.prev.next = x.next 45 else: 46 self.head = x.next 47 if x.next != None: 48 x.next.prev = x.prev 49 self.list.remove(x.key) 50 A=[9,16,4,1] 51 #初始化 52 L=DoubleLinkedList(A) 53 print(L) 54 print(L.list) 55 print(L.head.key) 56 print('#'*60) 57 #插入节点 58 L.list_insert(Node(None,None,25)) 59 print(L.list) 60 print(L.head.key) 61 print('#'*60) 62 #先搜寻节点,再删除 63 node=L.list_search(4) 64 L.list_delete(node) 65 print(L.list) 66 print(L.head.key) 67 ------------------------------------------------- 68 <__main__.DoubleLinkedList object at 0x03B17930> 69 [1, 4, 16, 9] 70 9 71 ############################################################ 72 [1, 4, 16, 9, 25] 73 25 74 ############################################################ 75 [1, 16, 9, 25] 76 25
1 class DoublyLinkedList2: 2 '''有哨兵的双向循环链表,哨兵用于简化边界条件的处理''' 3 def __init__(self,nil): 4 ''''链表初始化,设置哨兵(一个空点),只有哨兵链表为空''' 5 self.nil=nil 6 7 def list_search(self,k): 8 x=self.nil.next 9 while x !=self.nil and x.key!=k: 10 x=x.next 11 return x 12 13 def list_insert(self,x): 14 x.next=self.nil.next 15 self.nil.next.prev=x 16 self.nil.next=x 17 x.prev=self.nil 18 19 def list_delete(self,x): 20 x.prev.next=x.next 21 x.next.prev=x.prev
python中指针和对象的实现:对象的多数组表示:每个属性对应一个数组,一个对象有多个属性
1 class pointer_object: 2 '''指针和对象的实现''' 3 def __init__(self,L,free,key,l_next,prev): 4 '''初始化:链表L,自由表的第一个元素:free''' 5 self.L=L 6 self.free=free 7 self.key=key 8 self.l_next=l_next 9 self.prev=prev 10 def allocate_object(self): 11 '''对象的分配''' 12 if self.free==None: 13 print("out of space") 14 else:#自由表和链表相互交错 15 x=self.free 16 print("x:",x) 17 self.free=self.l_next[x-1] 18 print("x.next:",self.free) 19 return x 20 def free_object(self,x): 21 '''对象的释放''' 22 self.l_next[x-1]=self.free 23 self.free=x 24 def list_insert(self,x): 25 '''列表插入''' 26 self.l_next[x-1]=self.L 27 if self.L!=None: 28 self.prev[self.L-1]=x 29 self.L=x 30 self.prev[x-1]=None 31 32 L=7 33 free=4 34 key=[None,4,1,None,16,None,9,None] 35 l_next=[-1,3,-1,8,2,1,5,6] 36 prev=[None,5,2,None,7,None,-1,None] 37 po=pointer_object(L,free,key,l_next,prev) 38 print(po.allocate_object()) 39 40 po.key[3]=25 41 po.list_insert(4) 42 print(po.l_next) 43 print(po.key) 44 print(po.prev) 45 ----------------------------------------- 46 x: 4 47 x.next: 8 48 4 49 [-1, 3, -1, 7, 2, 1, 5, 6] 50 [None, 4, 1, 25, 16, None, 9, None] 51 [None, 5, 2, None, 7, None, 4, None]