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