赞
踩
一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。
- 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)
- cur = cur.next
- print ""
-
- def add(self, item):
- """头部插入元素"""
- node = Node(item)
- if self.is_empty():
- # 如果是空链表,将_head指向node
- self._head = node
- else:
- # 将node的next指向_head的头节点
- node.next = self._head
- # 将_head的头节点的prev指向node
- self._head.prev = node
- # 将_head 指向node
- self._head = node
-
- def append(self, item):
- """尾部插入元素"""
- node = Node(item)
- if self.is_empty():
- # 如果是空链表,将_head指向node
- self._head = node
- else:
- # 移动到链表尾部
- cur = self._head
- while cur.next != None:
- cur = cur.next
- # 将尾节点cur的next指向node
- cur.next = node
- # 将node的prev指向cur
- 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.prev = cur
- # 将node的next指向cur的下一个节点
- node.next = cur.next
- # 将cur的下一个节点的prev指向node
- cur.next.prev = node
- # 将cur的next指向node
- cur.next = node

删除元素
- 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:
- # 将第二个节点的prev设置为None
- cur.next.prev = None
- # 将_head指向第二个节点
- self._head = cur.next
- return
- while cur != None:
- if cur.item == item:
- # 将cur的前一个节点的next指向cur的后一个节点
- cur.prev.next = cur.next
- # 将cur的后一个节点的prev指向cur的前一个节点
- cur.next.prev = cur.prev
- break
- 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(0, 6)
- print("length:",ll.length())
- ll.travel()
- print(ll.search(3))
- print(ll.search(4))
- ll.remove(1)
- print("length:",ll.length())
- ll.travel()
length: 6
6
2
1
4
3
5
True
True
length: 5
6
2
4
3
5
单项循环列表
- class Node(object):
- """节点"""
- def __init__(self, item):
- self.item = item
- self.next = None
-
-
- class SinCycLinkedlist(object):
- """单向循环链表"""
- def __init__(self):
- self._head = None
-
- def is_empty(self):
- """判断链表是否为空"""
- return self._head == None
-
- def length(self):
- """返回链表的长度"""
- # 如果链表为空,返回长度0
- if self.is_empty():
- return 0
- count = 1
- cur = self._head
- while cur.next != self._head:
- count += 1
- cur = cur.next
- return count
-
- def travel(self):
- """遍历链表"""
- if self.is_empty():
- return
- cur = self._head
- print(cur.item)
- while cur.next != self._head:
- cur = cur.next
- print(cur.item)
-
-
-
- def add(self, item):
- """头部添加节点"""
- node = Node(item)
- if self.is_empty():
- self._head = node
- node.next = self._head
- else:
- #添加的节点指向_head
- node.next = self._head
- # 移到链表尾部,将尾部节点的next指向node
- cur = self._head
- while cur.next != self._head:
- cur = cur.next
- cur.next = node
- #_head指向添加node的
- self._head = node
-
- def append(self, item):
- """尾部添加节点"""
- node = Node(item)
- if self.is_empty():
- self._head = node
- node.next = self._head
- else:
- # 移到链表尾部
- cur = self._head
- while cur.next != self._head:
- cur = cur.next
- # 将尾节点指向node
- cur.next = node
- # 将node指向头节点_head
- node.next = self._head
-
- 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.next = cur.next
- cur.next = node
-
- def remove(self, item):
- """删除一个节点"""
- # 若链表为空,则直接返回
- if self.is_empty():
- return
- # 将cur指向头节点
- cur = self._head
- pre = None
- # 若头节点的元素就是要查找的元素item
- if cur.item == item:
- # 如果链表不止一个节点
- if cur.next != self._head:
- # 先找到尾节点,将尾节点的next指向第二个节点
- while cur.next != self._head:
- cur = cur.next
- # cur指向了尾节点
- cur.next = self._head.next
- self._head = self._head.next
- else:
- # 链表只有一个节点
- self._head = None
- else:
- pre = self._head
- # 第一个节点不是要删除的
- while cur.next != self._head:
- # 找到了要删除的元素
- if cur.item == item:
- # 删除
- pre.next = cur.next
- return
- else:
- pre = cur
- cur = cur.next
- # cur 指向尾节点
- if cur.item == item:
- # 尾部删除
- pre.next = cur.next
-
- def search(self, item):
- """查找节点是否存在"""
- if self.is_empty():
- return False
- cur = self._head
- if cur.item == item:
- return True
- while cur.next != self._head:
- cur = cur.next
- if cur.item == item:
- return True
- return False
-
- if __name__ == "__main__":
- ll = SinCycLinkedlist()
- ll.add(1)
- ll.add(2)
- ll.append(3)
- ll.insert(2, 4)
- ll.insert(4, 5)
- ll.insert(0, 6)
- print("length:",ll.length())
- ll.travel()
- print(ll.search(3))
- print(ll.search(7))
- ll.remove(1)
- print("length:",ll.length())
- ll.travel()

测试结果:
length: 6
6
2
1
4
3
5
True
False
length: 5
6
2
4
3
5
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。