常见数据结构(二)——链表
顺序表与链表都是线性表,但链表不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。
一、单向链表
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
#首先创建结点
class Node(object):
def __init__(self,item):
self.item=item
self.next=None
class SingleLinkList(object):
def __init__(self,node=None):
self.__head=node
'''is_empty链表是否为空'''
def is_empty(self):
return self.__head is None
'''length()链表长度'''
def length(self):
cur=self.__head
count=0
while cur!=None:
count+=1
cur=cur.next
return count
'''travel()遍历整个链表'''
def travel(self):
cur=self.__head
while cur!=None:
print(cur.item)
cur=cur.next
'''add(item)链表头部添加元素'''
def add(self,item):
node=Node(item)
node.next=self.__head
self.__head=node
'''append(item)链表尾部添加元素'''
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
'''insert(pos,item)指定位置添加元素'''
def insert(self,pos,item):
if pos<=0:
self.add(item)
elif pos>(self.length()-1):
self.append(item)
else:
node=Node(item)
count=0
cur=self.__head
while count<(pos-1):
count+=1
cur=cur.next
node.next=cur.next
cur.next=node
'''remove(item)删除节点'''
def remove(self,item):
pre=None
cur=self.__head
while cur!=None:
if cur.item==item:
if not pre:
self.__head=cur.next
else:
pre.next=cur.next
break
else:
pre=cur
cur=cur.next
'''search(item)查找节点是否存在'''
def search(self,item):
cur=self.__head
while cur!=None:
if cur.item==item:
return True
cur=cur.next
return False
if __name__=='__main__':
ll=SingleLinkList()
ll.add(1)
ll.add(2)
ll.append(3)
ll.insert(2,4)
print('length:',ll.length())
ll.travel()
print(ll.search(3))
print(ll.search(5))
ll.remove(1)
print('lenth:',ll.length())
ll.travel()
二、双向链表
每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。
class Node():
def __init__(self, item):
self.item = item
self.prev = None
self.next = None
class DoubleLinkList():
def __init__(self, node=None):
self.__head = node
'''is_empty链表是否为空'''
def is_empty(self):
return self.__head == None
'''length()链表长度'''
def length(self):
cur = self.__head
count = 0
while cur != None:
count += 1
cur = cur.next
return count
'''travel()遍历整个链表'''
def travel(self):
cur = self.__head
while cur != None:
print(cur.item)
cur = cur.next
'''add(item)链表头部添加元素'''
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
'''append(item)链表尾部添加元素'''
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
'''insert(pos,item)指定位置添加元素'''
def insert(self, pos, item):
if pos <= 0:
self.add(item)
elif pos > (self.length() - 1):
self.append(item)
else:
node = Node(item)
count = 0
cur = self.__head
while count < (pos - 1):
cur = cur.next
count+=1
node.prev = cur
node.next = cur.next
cur.next.prev = node
cur.next = node
'''remove(item)删除节点'''
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:
self.__head = cur.next
cur.next.prev = None
return
while cur != None:
if cur.item==item:
cur.prev.next = cur.next
cur.next.prev = cur.prev
break
cur = cur.next
'''search(item)查找节点是否存在'''
def search(self, item):
cur = self.__head
while cur != None:
if cur.item == item:
return True
cur = cur.next
return False
if __name__=='__main__':
ll=DoubleLinkList()
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()