双向链表
双向链表
一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。

操作
- is_empty() 链表是否为空
- length() 链表长度
- travel() 遍历链表
- add(item) 链表头部添加
- append(item) 链表尾部添加
- insert(pos, item) 指定位置添加
- remove(item) 删除节点
- search(item) 查找节点是否存在

1 # ------------节点实现------------ 2 class DoubleNode(): 3 """双向链表的结点""" 4 def __init__(self,elem): 5 # _item存放数据元素 6 self.elem=elem 7 # _next是下一个节点的标识 8 self.next=None 9 # _prev是上一个节点的标识 10 self.prev=None 11 12 13 # ------------双向链表的实现------------ 14 class DoubleLinkList(): 15 """双向链表""" 16 def __init__(self,node=None): 17 self.__head=node 18 19 def is_empty(self): 20 """判断链表是否为空""" 21 return self.__head==None 22 23 def length(self): 24 """链表长度""" 25 # cur初始时指向头节点 26 cur=self.__head 27 count=0 28 # 尾节点指向None,当未到达尾部时 29 while cur!=None: 30 count+=1 31 # 将cur后移一个节点 32 cur=cur.next 33 return count 34 35 def travle(self): 36 """遍历链表""" 37 cur=self.__head 38 while cur!=None: 39 print(cur.elem,end=' ') 40 cur=cur.next 41 print('') 42 43 def add(self,item): 44 """头部添加元素---头插法""" 45 node=DoubleNode(item) 46 node.next=self.__head 47 self.__head=node 48 node.next.prev=node 49 50 def append(self,item): 51 """尾部添加元素---尾插法""" 52 node=DoubleNode(item) 53 # 先判断链表是否为空,若是空链表,则将_head指向新节点 54 if self.is_empty(): 55 self.__head=node 56 # 若不为空,则找到尾部,将尾节点的next指向新节点 57 else: 58 cur=self.__head 59 while cur.next!=None: 60 cur=cur.next 61 # 将尾节点cur的next指向node 62 cur.next=node 63 # 将node的prev指向cur 64 node.prev=cur 65 66 def insert(self,pos,item): 67 """指定位置添加元素""" 68 # 若指定位置pos为第一个元素之前,则执行头部插入 69 if pos<=0: 70 self.add(item) 71 # 若指定位置超过链表尾部,则执行尾部插入 72 elif pos>(self.length()-1): 73 self.append(item) 74 # 找到指定位置 75 else: 76 node=DoubleNode(item) 77 count=0 78 # 移动到指定位置的前一个位置 79 cur=self.__head 80 while count<pos: 81 count+=1 82 cur=cur.next 83 node.next=cur 84 node.prev=cur.prev 85 node.prev.next=node 86 cur.prev=node 87 88 def search(self,item): 89 """链表查找节点是否存在,并返回True或者False""" 90 cur=self.__head 91 while cur!=None: 92 if cur.elem==item: 93 return True 94 else: 95 cur=cur.next 96 return False 97 98 def remove(self,item): 99 """删除节点""" 100 cur=self.__head 101 while cur!=None: 102 # 找到了指定元素 103 if cur.elem==item: 104 # 如果第一个就是删除的节点 105 if cur==self.__head: 106 self.__head=cur.next 107 if cur.next: 108 #判断链表是否只有一个节点 109 cur.next.prev=None 110 else: 111 # 将删除位置前一个节点的next指向删除位置的后一个节点 112 cur.prev.next=cur.next 113 if cur.next: 114 cur.next.prev=cur.prev 115 break 116 else: 117 # 继续按链表后移节点 118 cur=cur.next 119 120 if __name__ == '__main__': 121 li=DoubleLinkList() 122 print(li.is_empty()) 123 print(li.length()) 124 125 li.append(1) 126 li.add(4) 127 li.append(2) 128 li.append(3) 129 # print(li.is_empty()) 130 # print(li.length()) 131 li.travle() 132 li.insert(-1,5) 133 li.travle() 134 li.insert(2,6) 135 li.travle() 136 li.insert(8,7) 137 li.travle() 138 print(li.search(5)) 139 li.remove(5) 140 li.travle() 141 li.remove(1) 142 li.travle() 143 li.remove(20) 144 li.travle()
1 # 打印结果 2 True 3 0 4 4 1 2 3 5 5 4 1 2 3 6 5 4 6 1 2 3 7 5 4 6 1 2 3 7 8 True 9 4 6 1 2 3 7 10 4 6 2 3 7 11 4 6 2 3 7
posted on 2019-09-15 15:51 cherry_ning 阅读(144) 评论(0) 收藏 举报

浙公网安备 33010602011771号