基本数据结构-单向链表

单向链表

每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。

实现

  1. 举例引入
a=10
b=20
a,b=b,a  #交换变量的值
  • 本质:Python中a=10,并不是在内存a中存储10,而是在内存a中存储元素10的位置,并指向另一块已经存储元素10的区域;a,b=b,a 代表内存a和内存b改变指向,不改变元素存储的位置,从而达到交换的效果。
  • 推广:“=” 在Python中表示 “指向和链接”
  1. 节点实现
#创造单链表的结点
class Node(object):
    def __init__(self,elem):   # 初始化对象
        self.elem = elem       # elem存放数据元素
        self.next = None       # next是下一个节点的标识
		
		
node = Node(100)		# node=self;elem=100
  1. 单链表的实现
class SingleLinkList(object):  #创建单链表的类
    
	def __init__(self):
	    self._head = None  #设置初始的表头,_head是仅供内部使用
		#或者
		self.__head = node  #表头指向创建好的节点
	
	def is_empty(self):   #创造“判断是否为空”的对象操作
	    return self._head == None # 输出判断结果
	
	def length(self):     #创造“列表长度”的对象操作
	    #引入辅助指针Cur,指的是Cur和self._head一同指向第一个节点
		Cur = self.__head 
		count = 0        # count记录数量
		while Cur != None:  #不能是Cur.next != None, 否则少1
		    count += 1
			cur = cur.next #指针移动
	    return count
		
	def travel(self):     #创造“遍历整个列表”的对象操作
        Cur = self._head #游标 = 起始节点
	    while Cur != None:
		    print(cur.elem,end=" ") #end=" ",表示不换行
		    cur=cur.next
		
	def add(self,item):  #头部添加数据  O(1)
	     node = Node(item)   #元素封装成节点
		 node.next = self.__head  #整个单链不丢掉,先将新节点和后面链接
		 self.__head = node   #不需要考虑链表为空的情况
	
	def append(self,item): #尾部添加数据 O(n)
	    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): #指定位置添加数据 O(n)
	    if pos <= 0:
		    self.add(item)
		elif pos > self.length()-1
		    self.append(item)
		else:
	        pre=self.__head  #pre游标指向第一个元素 
	        count = 0
	        while count < (pos-1):
	            count+=1
		        pre = pre.next
	        node=Node(item)  # 当循环退出后,pre指向pos-1位置
	        node.next = pre.next
	        pre.next = node
	
	def remove(self,item):  #删除节点
	    cur = self_head 
		pre = none
		while cur != None:
		    if cur.elem == item:  #判断此节点是否是头节点
			    if cur == self.__head:
				    self.__head = cur.next
				else:
		            pre.next = cur.next
				break  #删完退出
		    else:
		        pre=cur
		        cur=cur.next
	
	def search(self,item): #查找节点是否存在
	    cur = self.__head  #空链直接返回False
		while cur != None
	        if cur.elem == item:
		        return True
	        else:
		        cur=cur.next
	    return False
	
	
	
single_obj = SingleLinkList() #构建具体的单链表对象 相似与li=list()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值