Python数据结构3——链表
单向链表
Python独特的语法特性,保存对象的地址。
None是一个对象,而NULL是一个类型。
与c++不同,Python中没有NULL,只有None,None有自己的特殊类型NoneType。None不等于0、任何空字符串、False等。在Python中,None、False、0、“”(空字符串)、、()(空元组)、{}(空字典)都相当于False。
节点:
链表是由节点组成的:
class Node(object):
'单链表的节点'
def __init__(self,item):
#item存放数据元素
self.item=item
#next是下一个节点的标识
self.next=None
对于链表,要能够满足:
单链表实现:
#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: 83788
@file: mypro3.py
@time: 2022/09/08
@desc:
"""
class Node(object):
'单链表的节点'
def __init__(self,item):
#item存放数据元素
self.item=item
#next是下一个节点的标识
self.next=None
class SingleLinkList(object):
'单链表'
def __init__(self,node=None):
self.__head=node
def is_empty(self):
'链表是否为空'
return self.__head ==None
def length(self):
'单链表长度'
# cur游标,用来移动遍历节点
cur = self.__head
# count记录数量
count = 0
while cur != None:
cur = cur.next
count += 1
return count
def travel(self):
'遍历单链表'
#cur游标,用来移动遍历节点
cur=self.__head
while cur!=None:
print(cur.item,end=' ')
cur=cur.next
print()
def add(self,item):
'单链表头部添加元素'
node = Node(item)
node.next=self.__head
#上式表示把head指向的节点赋值给node
self.__head = 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
def insert(self,pos,item):
'''单链表指定位置添加元素
:param pos 从0开始
'''
node = Node(item)
pre=self.__head
if pos<=0:
self.add(item)
elif pos>self.length()-1:
self.append(item)
else :
count = 0
while count<(pos-1):
count+=1
pre=pre.next
node.next=pre.next
pre.next=node
def search(self,item):
'查找节点是否存在'
cur=self.__head
while cur!=None:
if cur.item==item:
return True
else:
cur=cur.next
return False
def remove(self,item):
'删除节点'
while self.search(item)==True:
pre = None
cur = self.__head
while cur!=None:
if cur.item==item:
#先判断此节点是不是头节点
if (pre==None):
self.__head=cur.next
else:
pre.next=cur.next
break
else:
pre=cur
cur=cur.next
return('结束')
if __name__=='__main__':
ll=SingleLinkList()
ll.append(1)
ll.append(2)
ll.append(2)
ll.append(4)
ll.append(2)
ll.add(2)
ll.insert(-1,100)
ll.travel()
ll.remove(2)
ll.travel()
单链表与顺序表对比
双向链表
节点的定义:
class Node(object):
'单链表的节点'
def __init__(self,item):
self.item=item
self.prev=None
self.next=None
双链表的实现:(使用继承方法)
#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: 83788
@file: mypro4-shuang.py
@time: 2022/09/09
@desc:
"""
from mypro3 import SingleLinkList
class Node(object):
'单链表的节点'
def __init__(self,item):
self.item=item
self.prev=None
self.next=None
class DoubleLinkList(SingleLinkList):
def add(self,item):
'单链表头部添加元素'
node = Node(item)
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
node.prev=cur
cur.next=node
def insert(self,pos,item):
'''单链表指定位置添加元素
:param pos 从0开始
'''
node = Node(item)
cur=self.__head
if pos<=0:
self.add(item)
elif pos>self.length()-1:
self.append(item)
else :
count = 0
while count<(pos):
count+=1
cur=cur.next
node.next=cur
node.prev=cur.prev
cur.prev.next=node
cur.prev=node
def remove(self,item):
'删除节点'
while self.search(item)==True:
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
return('结束')
if __name__=='__main__':
ll=SingleLinkList()
ll.append(1)
ll.append(2)
ll.append(2)
ll.append(4)
ll.append(2)
ll.add(2)
ll.insert(-1,100)
ll.travel()
ll.remove(2)
ll.travel()