• 双向链表


      1 class Node:
      2     """双向链表节点"""
      3     def __init__(self,elem):
      4         self.elem = elem
      5         self.next = None
      6         self.prev = None
      7 #构造双向链表类
      8 class DoubleLinkList:
      9     #初始化方法
     10     def __init__(self,node = None):
     11         #判断node是否为空
     12         if node != None:
     13             headNode = Node(node)
     14             self.__head = headNode
     15         else:
     16             self.__head = node
     17 
     18     #在头部进行插入
     19     def add(self,item):
     20         #将传入的值构造成节点
     21         node = Node(item)
     22         #判断是否是空列表
     23         if self.is_empty():
     24             self.__head = node
     25         else:
     26             #将新节点的链接域next指向头节点
     27             node.next = self.__head
     28             #将_head的头节点的prev指向node
     29             self.__head.prev = node
     30             #将链表的头_head指向新节点
     31             self.__head = node
     32 
     33     #在尾部追加元素
     34     def append(self,item):
     35         #将传入的值构造成节点
     36         node = Node(item)
     37         if self.is_empty():
     38             self.__head = node
     39         else:
     40             curNode = self.__head
     41             while curNode.next != None:
     42                 curNode = curNode.next
     43             curNode.next = node
     44             node.prev = curNode
     45 
     46     #在指定位置添加元素
     47     def insert(self,pos,item):
     48         """在指定位置添加节点"""
     49         if pos <= 0:
     50             self.add(item)
     51         elif pos > (self.length()-1):
     52             self.append(item)
     53         else:
     54             node = Node(item)
     55             count = 0
     56             curNode = self.__head
     57             #移动到指定位置的前一个位置
     58             while count < (pos-1):
     59                 count += 1
     60                 curNode = curNode.next
     61             #修改指向
     62             #将node节点的前驱指向当前节点
     63             node.prev = curNode
     64             #将node节点的后继指向当前节点的下一个节点
     65             node.next = curNode.next
     66             #将当前节点的下一个节点的额前驱指向node节点
     67             curNode.next.prev = node
     68             #将当前节点的后继指向node节点
     69             curNode.next = node
     70 
     71     #删除节点
     72     def remove(self,item):
     73         curNode = self.__head
     74         while curNode != None:
     75             if curNode.elem == item:
     76                 #判断是否是头节点
     77                 if curNode == self.__head:
     78                     self.__head = curNode.next
     79                     #判断链表是否只有一个节点,如果只有一个节点,则不需要移动下一个节点的前驱
     80                     if curNode.next:
     81                         curNode.next.prev = None
     82                 else:
     83                     #删除
     84                     curNode.prev.next = curNode.next
     85                     #判断当前节点是否是最后一个节点,如果是最后一个节点,最后一个节点的下一个节点指向None
     86                     if curNode.next:
     87                         curNode.next.prev = curNode.prev
     88                 break
     89             else:
     90                 curNode = curNode.next
     91 
     92     #查找节点是否存在
     93     def search(self,item):
     94         curNode = self.__head
     95         while curNode != None:
     96             if curNode.elem == item:
     97                 return True
     98             curNode = curNode.next
     99         return False
    100 
    101     #计算单向链表的长度
    102     def length(self):
    103         count = 0
    104         curNode = self.__head
    105         while curNode != None:
    106             count += 1
    107             curNode = curNode.next
    108         return count
    109  
    110     #判断链表是否为空
    111     def is_empty(self):
    112         #判断head指向是None,如果是None,则是空链表
    113         return self.__head == None
    114 
    115     #遍历链表
    116     def travel(self):
    117         curNode = self.__head
    118         while curNode != None:
    119             print(curNode.elem,end='	')
    120             curNode = curNode.next
    121         print("")
    122 
    123 if __name__ == '__main__':
    124     doubleLinkList = DoubleLinkList()
    125     doubleLinkList.add(11)
    126     doubleLinkList.add(22)
    127     doubleLinkList.add(33)
    128     doubleLinkList.travel()
    129     print('-----------尾部追加元素----------')
    130     doubleLinkList.append(100)
    131     doubleLinkList.append(200)
    132     doubleLinkList.append(300)
    133     doubleLinkList.travel()
    134     print('-----------指定位置插入-----------')
    135     doubleLinkList.insert(-1,44)
    136     doubleLinkList.travel()
    137     doubleLinkList.insert(100,400)
    138     doubleLinkList.travel()
    139     doubleLinkList.insert(2,99)
    140     doubleLinkList.travel()
    141     print('------------ 删除节点--------------')
    142     doubleLinkList.remove(44)
    143     doubleLinkList.travel()
    144     doubleLinkList.remove(99)
    145     doubleLinkList.travel()
    146     doubleLinkList.remove(400)
    147     doubleLinkList.travel()
    148     print('链表的长度:',doubleLinkList.length())
    149     print('查找节点11',doubleLinkList.search(11))
    150     print('查找节点111',doubleLinkList.search(111))
     1 33      22      11
     2 -----------尾部追加元素----------
     3 33      22      11      100     200     300
     4 -----------指定位置插入-----------
     5 44      33      22      11      100     200     300
     6 44      33      22      11      100     200     300     400
     7 44      33      99      22      11      100     200     300     400
     8 ------------ 删除节点--------------
     9 33      99      22      11      100     200     300     400
    10 33      22      11      100     200     300     400
    11 33      22      11      100     200     300
    12 链表的长度: 6
    13 查找节点11 True
    14 查找节点111 False
    正是江南好风景
  • 相关阅读:
    数据结构学习之前言,为年后换新工作做准备
    马云不想成为“马云”
    2014找工作总结-机会往往留给有准备的人
    数据分析≠Hadoop+NoSQL,不妨先看完善现有技术的10条捷径
    做个犀利的码农:如何持续培养/更新自己的开发技能
    Google七夕情人节Doodle背后技术揭秘
    把帖子用循环显示出来
    php验证登录
    用户注册
    form 表单用php来跳转页面
  • 原文地址:https://www.cnblogs.com/monsterhy123/p/12882889.html
Copyright © 2020-2023  润新知