上一章我们将到了单链表,这里我们将提到双链表和单项循环列表,以及其对应的一些内置方法。
双链表
单链表的每个节点只能记录下一个节点的位置,而双链表的节点不仅可以记录下一个节点也可以记录上一个节点。所以,节点有三个属性–pre (指向上一个节点)–data(节点的值)–next(指向下一个节点)。
class Node():
def __init__(self,data):
self.pre=None
self.data=data
self.next=None
在双链表中的一些常用内置方法,一般在做插入等操作时,可以进行画图分析,要学会使用双指针的思想。
class DoubleLink():
def __init__(self):
self._head=None
def is_empty(self):#双链表是否为空
if self._head==None:
return True
else:
return False
def length(self):#双链表的长度
if self.is_empty():
return 0
else:
cur=self._head
count=0
while cur!=None:
cur=cur.next
count+=1
return count
def add(self,data):#头部添加元素
node=Node(data)
if self.is_empty():
self._head=node
else:
node.next=self._head
self._head.pre=node
self._head=node
def travel(self):#遍历双链表
cur=self._head
while cur!=None:
print cur.data
cur=cur.next
def append(self,data)##在双链表后面添加元素
node=Node(data)
if self.is_empty():
self._head=node
else:
cur=self._head
while cur.next!=None
cur=cur.next
cur.next=node#将尾节点的next指向node
node.pre=cur#将node的pre指向尾节点
def insert(self,pos,data):
node=Node(data)
if pos<=0:
self.add(data)
if pos>=(self.length()-1):
self.append(data)
else:
cur=self._head
#prev=None
for i in range(pos-1):###移动到指定位置的前一个节点
#prev=cur
cur=cur.next
###添加进去的节点pre指向cur
node.pre=cur
###添加进去的节点next指向cur的下一个节点
node.next=cur.next
cur.next.pre=node
cur.next=node
:
单向循环链表
单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
class Node():
def __init__(self,data):
self.data=data
self.next
class CriLinked():
def __init__(self):
self._head=None
def is_empty(self):#判断链表是否为空
if self._head=None:
return True
else:return False
def add(self,data):###头部添加元素
if self.is_empty():
self._head=node
node.next=self._head
else:
node=Node(data)
cur=self._head
while cur.next!=self._head
cur=cur.next
cur.next=node
node.next=self._head
self._head=node
def insert(self,pos,data):#在指定位置添加节点
node=Node(data)
if pos<=0:
self.add(data)
if pos>(self.length()-1):
self.append(data)
else:
cur=self._head
count=0
while count<pos-1:
cur=cur.next
node.next=cur.next
cur.next=node
def remove(self, item):#删除一个节点
if self.is_empty():
return None
cur=self._head
pre=None
if cur.data==item: # 若头节点的元素就是要查找的元素item
# 如果链表不止一个节点
if cur.next==self._head:
while cur.next!=self._head:
cur=cur.next
cur.next=self._head.next
self._head=self._head.next
else:
pre=self._head# 第一个节点不是要删除的
while cur.next!=self._head:
if cur.data==item:
pre.next=cur.next
else:
pre=cur
cur=cur.next
if cur.data==item: # cur 指向尾节点
pre.next=cur.next