python 链表

链表是由一系列节点组成的元素集合,每个节点包含两部分,数据域item和指向下一个节点的指针next。通过节点之间的相互连接,最终串联成一个链表

箭头就是指向

item 是存的几就是几
next 这个节点的下一个节点是谁(指向下一个节点)
在这里插入图片描述

在这里插入图片描述

头插发

在这里插入图片描述

3要成为新的头
在这里插入图片描述

尾插法
在这里插入图片描述

在这里插入图片描述

class Node:
	def __init__(self,item):
		self.item = item
		self.next = None

a = Node(1)
b = Node(2)
c = Node(3)
#怎么把他们链接起来呢 
a.next = b
b.next = c 

只需要通过a的节点,就能找到c


class Node:
    def __init__(self, item):
        #数据域item 头是几
        self.item = item
        #下一个节点指针
        self.next = None

#头结点
def create_linklist_head(li):
    #头结点
    head = Node(li[0])
    #从1开始,0已经有了
    for element in li[1:]:
        #创建新节点
        node = Node(element)
        #新的节点链接指向
        node.next = head
        #head重新复制指向它
        head = node
    return head

#尾插法
def create_linklist_tail(li):
#创建第一个节点
    head = Node(li[0])
    #同时有头和尾都指向它
    tail = head
    for element in li[1:]:
    	#创建新节点
        node = Node(element)
        tail.next = node
        #新的node 称为最后一个
        tail = node
    return head

def print_linklist(lk):
    while lk:
        print(lk.item, end=',')
        lk = lk.next

lk = create_linklist_head([1,2,3,6,8])
# print(lk.next.item)
# print(lk.item)
#lk = create_linklist_tail([1,2,3,6,8])
print_linklist(lk)


在这里插入图片描述

在这里插入图片描述

单向循环链表
在这里插入图片描述

如果只有一个结点,node.next指向的是它自己

长度 

在这里插入图片描述

append的方法

  就是下面的图片 
  #新结点指向头
  node.next = self.__head
  #原最后一个结点。指向新节点
  cur.next = node

在这里插入图片描述

#头插法
在这里插入图片描述

在这里插入图片描述

#删除

在这里插入图片描述

#单链表链表  从左往右读
class Node(object):
	"""双向链表节点"""
	def __init__(self,item):
		#数据区
		self.elem = item
		#指向后一个节点
		self.next = None
#单链表循环
class LinkList(object):
	def __init__(self,node=None):
		#代表头节点
		self.__head = node
		#特殊处理回环 如果只有要给结点,node.next指向的是它自己 
		if node:
			node.next = node 

	#判断链表是否为空
	def is_empty(self):
		return self.__head == None

	def length(self):
		"""返回链表的长度"""
		if self.is_empty():
			return 0 

		else:

			#cur游标移动 count从1开始
			cur = self.__head
			#count用来计数
			count = 1
			while cur != self.__head:
				count += 1
				#让cur游标可以向下移动
				cur = cur.next
			return count
	
	#遍历整个链表
	def travel(self):
		if self.is_empty():
			return
		#建立游标等于起始节点
		else:
			cur = self.__head
			while cur.next != self.__head:
				print(cur.elem,end=" ")
				cur = cur.next
			#退出循环,cur指向了尾结点
			print(cur.elem,end=' ')
			#换行
			print("")

	#头插法
	def add(self,item):
		#新节点
		node = Node(item)
		if self.is_empty():
			#特殊处理只有一个节点的时候
			self.__head = node
			node.next = node
		else:
			#游标
			cur = self.__head 
			while cur.next != self.__head:
				cur = cur.next
			#退出来就是cur 停留在最后的位置 
			node.next = self.__head
			self.__head = node 
			#最后一个指向新的 形成回环
			cur.next = node
	

	def append(self,item):
		"""链表尾部添加元素"""
		node = Node(item)  #定义新节点
		#链表是否为空链表
		if self.is_empty():
			#如果为空,新的节点加了进去
			self.__head = node
			#处理特殊 为空是第一个结点 node.next =它自己(node)
			node.next = node 
		else:
			#头节点 创建游标
			cur = self.__head   #设置指向头结点的游标  此时的当前链表第一个节点,就是头节点指向的节点
			#cur到最后一个节点停下
			while cur.next != self.__head:
				cur = cur.next
			#cur 此时在最后一个位置 
			#新结点指向头
			node.next = self.__head
			#原最后一个结点。指向新节点
			cur.next = node
	
	#插入法  #pos从零开始
	def insert(self,pos,item):
		"""在指定位置添加元素"""
		#指向不是头部元素,self.__head的地址
		# 为下一个元素,所以pre为下一个元素
		if pos <= 0:
			#认为是头插法
			self.add(item)
		#假如长度是3 pos大于2要特殊处理  
		elif pos > (self.length()-1):
			#尾插法
			self.append(item)
		else:
			cur = self.__head
			count = 0
			while count < pos:
				count+=1
				cur = cur.next
			#新节点
			node = Node(item)
			#把节点链接到中间任意位置 插入前一个节点
			node.next = cur
			node.prev = cur.prev
			cur.prev.next = node
			cur.prev = node

	#删除有3个游标
	def remove(self,item):
		"""删除元素"""
		if self.is_empty():
			return

		else:
			cur = self.__head
			pur = None
			while cur.next != self.__head:
				#判断cur的数据是否为要删除的数据 
				if cur.elem == item:
					
					#判断此节点是否为头节点
					#是头节点  现在是删除第一个节点
					if cur == self.__head:
						#考虑回环,还需要要给游标拿到尾节点位置 
						#删除第一个节点
						#游标 这里直接将rear移动到最后即可 考虑回环 还需要一个游标拿到尾节点位置 还是先等于头
						rear = self.__head  
						while rear.next != self.__head:
							rear = rear.next
						#退出循环 此时 rear指向最后一个节点了
						self.__head = cur.next
						#回环
						rear.next = self.__head
						if cur.next != None:
							#是否只有一个节点
							cur.next.prev = None
					else:
						#其他的节点 
						pre.next = cur.next
					return	
				else:
					#移动游标 pre 先动  cur后动 
					pre = cur
					#cur游标向下移动
					cur = cur.next
			#退出循环时候 cur指向最后一个节点    如果当前cur指向的节点等于要删除的 
			if cur.elem == item:
				#考虑只有一个节点
				if cur == self.__head:
					self.__head = None
				else:
					pre.next = cur.next

	#查找别丢下最后要给
	def search(self,item):
		"""查找结点是否存在"""
		#如果是一个空链表
		if self.is_empty():
			return False

		else:
			cur = self.__head
			while cur.next != self.__head:
				#cur数据是否为查找的数据 item是要查的数据 
				if cur.elem == item:
					return True
				else:
					cur = cur.next
			#处理最后一个节点 当前停留的元素
			if cur.elem == item:
				return True
			#遍历完成 
			return False

if __name__ == '__main__':
	ll = LinkList()
	#第一次的
	print(ll.is_empty())
	print(ll.length())
	print("----------------------------------")
	ll.travel()
	ll.append(1)
	print(ll.is_empty())
	print(ll.length())
	
	ll.append(2)	
	ll.append(3)
	ll.append(4)
	ll.append(5)
	ll.travel()
	ll.remove(2)
	ll.travel()
	ll.remove(4)
	ll.travel()

在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟伟哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值