双向链表

双向链表

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

操作

  • 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)    收藏  举报

导航