• 链表


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

     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]
    指针和对象的实现
  • 相关阅读:
    杂项
    hdu 2094
    hdu acm 1004
    android 重装sdk或者系统的时模拟器出现can open ****
    使用Java模拟操作系统高优先级算法
    各种语法解释及用法
    枚举与结构
    闭包
    socket
    异常
  • 原文地址:https://www.cnblogs.com/yu-liang/p/9212396.html
Copyright © 2020-2023  润新知