双向链表

  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='\t')
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

 

posted @ 2020-05-13 15:54  小他_W  阅读(145)  评论(0编辑  收藏  举报