阅读目录
概念双向链表分步实现双向链表完整实现
概念
'''
一种更复杂的链表是“双向链表”或“叫双面链表”。
每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;
而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。
'''
双向链表分步实现
class Node(object):
"""双向链表节点"""
def __init__(self
, item
):
self
.item
= item
self
.next = None
self
.prev
= None
class DLinkList(object):
"""双向链表"""
def __init__(self
):
self
.__head
= None
def is_empty(self
):
"""判断链表是否为空"""
return self
.__head
== None
def length(self
):
"""返回链表的长度"""
cur
= self
.__head
count
= 0
while cur
!= None:
count
+= 1
cur
= cur
.next
return count
def travel(self
):
"""遍历链表"""
cur
= self
.__head
while cur
!= None:
print(cur
.item
, end
="")
cur
= cur
.next
print("")
def add(self
, item
):
"""头部插入元素"""
node
= Node
(item
)
if self
.is_empty
():
self
.__head
= node
else:
node
.next = self
.__head
self
.__head
.prev
= node
self
.__head
= node
node
.next = self
.__head
self
.__head
= node
node
.next.prev
= node
def append(self
, item
):
"""尾部插入元素"""
node
= Node
(item
)
if self
.is_empty
():
self
._head
= node
else:
cur
= self
._head
while cur
.next != None:
cur
= cur
.next
cur
.next = node
node
.prev
= cur
def search(self
, item
):
"""查找元素是否存在"""
cur
= self
._head
while cur
!= None:
if cur
.item
== item
:
return True
cur
= cur
.next
return False
def insert(self
, pos
, item
):
if pos
<= 0:
self
.add
(item
)
elif pos
> (self
.length
() - 1):
self
.append
(item
)
else:
cur
= self
.__head
count
= 0
while count
< pos
:
count
+= 1
cur
= cur
.next
node
= Node
(item
)
node
.next = cur
node
.prev
= cur
.prev
cur
.prev
.next = node
cur
.prev
= node
'''
# 方法二:
node.next=cur
node.prev=cur.prev
cur.prev=node
node.prev.next=node #注意打断顺序,和断开链接后是否可以找到前一个节点
'''
else:
node
= Node
(item
)
cur
= self
._head
count
= 0
while count
< (pos
- 1):
count
+= 1
cur
= cur
.next
node
.prev
= cur
node
.next = cur
.next
cur
.next.prev
= node
cur
.next = node
cur
.next = node
node
.next.prev
= node
def remove(self
, item
):
if is_empty
(self
):
return
cur
= self
.__head
while cur
!= None:
if cur
.item
== item
:
if cur
== self
.__head
:
self
.__head
= cur
.next
if cur
.next:
cur
.next.prev
= None
else:
cur
.prev
.next = cur
.next
if cur
.next:
cur
.next.prev
= cur
.prev
break
else:
cur
= cur
.next
'''
注意:
当cur是头节点,且仅有一个节点;和cur是尾结点,且是最后一个节点时,
这两种情况下都会出现None
所以只需忽略,只要加上一个条件 if cur.next: 为真时,
表示 是头节点,后面还有节点;是尾结点前面的某一个节点
'''
def remove(self
, item
):
if self
.is_empty
():
return
else:
cur
= self
.__head
if cur
.item
== item
:
if cur
.next == None:
self
.__head
= None
else:
cur
.next.prev
= None
self
.__head
= cur
.next
return
while cur
!= None:
if cur
.item
== item
:
cur
.prev
.next = cur
.next
cur
.next.prev
= cur
.prev
break
cur
= cur
.next
双向链表完整实现
class Node(object):
"""双向链表节点"""
def __init__(self
, item
):
self
.item
= item
self
.next = None
self
.prev
= None
class DLinkList(object):
"""双向链表"""
def __init__(self
):
self
.__head
= None
def is_empty(self
):
"""判断链表是否为空"""
return self
.__head
== None
def length(self
):
"""返回链表的长度"""
cur
= self
.__head
count
= 0
while cur
!= None:
count
+= 1
cur
= cur
.next
return count
def travel(self
):
"""遍历链表"""
cur
= self
.__head
while cur
!= None:
print(cur
.item
, end
="")
cur
= cur
.next
print("")
def add(self
, item
):
"""头部插入元素"""
node
= Node
(item
)
if self
.is_empty
():
self
.__head
= node
else:
node
.next = self
.__head
self
.__head
.prev
= node
self
.__head
= node
'''
# 将node的next指向__head的头节点
node.next = self.__head
# 将__head的头节点指向node
self.__head = node
# 将第一个节点的prev指向node
node.next.prev = node
'''
def append(self
, item
):
"""尾部插入元素"""
node
= Node
(item
)
if self
.is_empty
():
self
.__head
= node
else:
cur
= self
.__head
while cur
.next != None:
cur
= cur
.next
cur
.next = node
node
.prev
= cur
def search(self
, item
):
"""查找元素是否存在"""
cur
= self
.__head
while cur
!= None:
if cur
.item
== item
:
return True
cur
= cur
.next
return False
def insert(self
, pos
, item
):
if pos
<= 0:
self
.add
(item
)
elif pos
> (self
.length
() - 1):
self
.append
(item
)
else:
node
= Node
(item
)
cur
= self
.__head
count
= 0
while count
< (pos
- 1):
count
+= 1
cur
= cur
.next
node
.prev
= cur
node
.next = cur
.next
cur
.next.prev
= node
cur
.next = node
cur
.next = node
node
.next.prev
= node
def remove(self
, item
):
if self
.is_empty
():
return
cur
= self
.__head
while cur
!= None:
if cur
.item
== item
:
if cur
== self
.__head
:
self
.__head
= cur
.next
if cur
.next:
cur
.next.prev
= None
else:
cur
.prev
.next = cur
.next
if cur
.next:
cur
.next.prev
= cur
.prev
break
else:
cur
= cur
.next
if __name__
== "__main__":
ll
= DLinkList
()
ll
.add
(1)
ll
.add
(2)
ll
.append
(3)
ll
.insert
(2, 4)
ll
.insert
(4, 5)
ll
.insert
(4, 8)
ll
.insert
(4, 5)
ll
.insert
(0, 6)
ll
.insert
(0, 7)
ll
.insert
(0, 6)
print("length:", ll
.length
())
ll
.travel
()
print(ll
.search
(3))
print(ll
.search
(4))
ll
.remove
(1)
ll
.remove
(6)
ll
.remove
(5)
print("length:", ll
.length
())
ll
.travel
()
转载请注明原文地址: https://mac.8miu.com/read-516564.html