链表

链表:通过指针对每个元素进行存储

 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]
指针和对象的实现

 

posted on 2018-07-26 10:18  温润有方  阅读(321)  评论(0编辑  收藏  举报