数据结构-链表-单向链表

数据结构-链表-单向链表

链表(Linked List)是由许多相同数据类型的数据按特定顺序排列而成的线性表。

一个单向链表节点基本上是由两个元素(数据字段和指针)所组成的,而指针将会指向下一个元素在内存中的地址

在单向链表中,第一个节点是链表头指针,指向最后一个节点的指针设为None,表示它是链表尾,不指向任何地方。

  1. 建立单向链表

    在python中,先定义一个类,关键属性是next(指针字段)

    class student:
    		def __init__(self):
    				self.name = ''
    				self.score = 0
    				self.next = None
    

    完成之后就是链表的设计,首先需要指定链表头,可以实例一个对象,然后指定next的元素,随后逐渐将next后移,即是将next赋值为下一个元素

    head = student()  #建立链表头
    head.next = None	#链表头的下一个元素指向None
    ptr = head	#初始指针的位置,从第一个开始
    select = 0
    
    while select != 2:
    		print("(1) 新增	(2) 离开")
    		try:
    				select = int (input('请输入选项:'))
    		except ValueError:
    				print("输入错误,请重新输入/n")
    		if select ==1:
    				new_data = student()	#新增下一个元素
    				new_data.name = input('姓名:')
    				new_data.score = input('成绩:')
    				ptr.next = new_data		#指针指向新的元素
    				new_data.next = None		#新元素的next设置为None
    				ptr = ptr.next		#指针后移
    
  2. 遍历单向数组

    遍历的过程就是使用指针运算来访问链表的每个节点,在循环中逐渐将指针后移,实现链表的遍历

    ptr = head.next		#设置存取指针从链表的头部开始
    while ptr != None:
    		print('姓名:%s/t成绩:%d'%(ptr.name,ptr.score))
    		ptr = ptr.next		#将ptr移动下一个元素
    
  3. 在单向链表中插入新节点

    可以分为三种情况,在链表的头部,链表的尾部,链表中间的任意位置

    • 插入到链表的头部

      newnode.next = first
      first = newnode
      
    • 插入到尾部

      ptr.next = newnode
      newnode.next = None
      
    • 插入到链表中的任意位置

      newnode.next = x.next
      x.next = newnode
      
  4. 单向链表中删除节点

    可以分为三种情况,在链表的头部,链表的尾部,链表中间的任意位置

    • 在链表的头部

      头部删除的节点是top

      top = head
      head = head.next
      
    • 在链表的尾部

      ptr.next = tail
      ptr.next = None
      
    • 在链表中间的任意位置

      删除的元素是 y

      y = ptr.next
      ptr.next = y.next
      
  5. 单向链表的反转

    简单地说,就是将链表的指向反转过来,就需要三个指针常量来转换

    class employee:
    		def __init__(self):
    				self.name = ''
    				self.salary = 0
    				self.next = None
    	
    	def invert(x):		#x为链表的头指针
    			p = x 	#将p指向链表的开头
    			q = None		#q是p的前一个节点
    			while p != None:
    					r =q	#将r接到q之后
    					q = p	#将q接到p之后
    					p = p.next	#p移到一下个节点
    					q.next = r	#q连接到之前的节点
    			return q
    
  6. 单向链表的连接

    只需要将一个的尾部与另一个的头部相连即可

    def concatlist(ptr1,ptr2):	#ptr1和ptr2分别是链表头
    		ptr = ptr1
    		while ptr.next != None:		#找到ptr1的尾部元素
    				ptr = ptr.next
    		ptr.next = ptr2
    		return ptr1
    
  7. 多项式链表表示法

    在数组结构中也表示过多项式,但是使用数组结构表示时常出现一些问题,比如在多项式内容变化时,对数组结构影像相当大,算法处理也不容易。由于数组是静态数据结构,因此事先需要定义一块连续的且足够大的内存空间,这样就容易造成了内存空间浪费

    使用链表表示,每一个元素需要三个变量

    COEFEXPLINK
    表示该变量的系数表示该变量的指数指向下一个节点的指针

    A(x) = 3X^3 + 6X -2表示为

    COEFEXPLINKCOEFEXPLINKCOEFEXPLINK
    32\------>61\------>-20\
    def create_link(data):		#建立多项式子程序
    		newnode = LinkedList()
    		if not newnode:
    				print('内存分配失败')
    				sys.exit(0)
    		if i == 0:
    				newnode.coef = data[i]
    				newnode.exp = 3 - i
    				newnode.next = None
    				head = newnode
    				ptr = head
    		elif data[i] != 0:
    				newnode.coef =data[i]
    				newnode.exp = 3 - i
    				newnode.next = None
    				ptr.next = newnode
    				ptr = newnode
    		return head
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

牧码文

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

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

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

打赏作者

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

抵扣说明:

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

余额充值