数据结构-链表-环形链表

数据结构-链表-环形链表

环形链表就是将单链表的尾部指向头部,从而形成一个单方向的环形结构,环形链表中每个元素都可以是head,也都可以是尾部,这样就不用担心链表头指针遗失的问题,而且在遍历链表的时候可以在任一节点来遍历其他节点

  1. 环形链表的建立

    class student:
    		def __init__(self):
    				self.name = ''
    				self.no = ''
    				self.next = None
    				
    	head = student()	#新增链表头元素
    	ptr = head		#设置存放指针位置
    	ptr.next = None		#目前没有下一个元素
    	select = 0
    	while select != 2:
    			select = int(input('(1) 新增 (2) 离开 =>'))
    			if select == 2:
    					break
    			ptr.name = input('姓名:')
    			ptr.no = input('学号:')
    			new_data = student()	#新增下一个元素
    			ptr.next = new_data		#连接下一个元素
    			new_data.next = None		#下一个元素的next先设置为None
    			ptr = new_data		#存取指针设置为新元素所在的位置
    
  2. 环形链表的遍历

    与单向链表的遍历十分相似,只不过单向链表的结束条件是ptr.next = None,而环形链表的结束条件是ptr.next = head

    ptr = head
    while True:
    		print(ptr.name,ptr.no)
    		ptr = ptr.next		#将head移到后一个元素
    		if ptr.next == head:
    				break
    
  3. 在环形链表中插入新节点

    因为环形链表中每一个元素指针都是指向一下个节点,所以没有所谓的从链表尾部插入的问题,通常只有两种情况:

    • 将新节点插在第一个节点前成为链表头部:首先将新节点x的指针指向原链表头节点,并遍历整个链表找到链表尾部,将它的指针指向新增节点,最后将链表表头指针指向新节点

      x.next = head
      CurNode = head
      while CurNode.next != head:
      		CurNode = CurNode.next		#找到链表末尾后,将它的指针指向新增节点
      CurNode.next = x
      head = x 		#将链表头指针指向新增节点
      
    • 将新节点x插在链表中任意节点I之后:首先将新节点X的指针指向I节点的下一节点,并将I节点的指针指向X节点

      X.next = I.next
      I.next = X
      
  4. 环形链表中删除节点

    环形链表的删除和插入方法类似,也可以分为两种情况

    • 删除环形链表的第一个节点:首先将链表头指针移到下一个节点,将最后一个节点的指针指向新的链表头部,新的链表头部就是原链表的第二个节点

      CurNode = head
      while CurNode.next != head:
      		CurNode = CurNode.next		#找到最后一个节点
      TailNode = CurBode		#找到最后一个节点并记录下来
      head = head.next()		#将表头移动到一下个节点
      TailNode.next = head		#将最后一个节点指针指向新的链表头部
      
    • 删除环形链表的中间节点:首先找到节点Y前一个节点previous,将previous节点的指针指向节点Y的下一个节点

      CurNode = head
      while CurNode.next != delnode:
      		CurNode = CurNode.next		#找到要删除节点的前一个节点
      PreNode = CurNode		#找到要删除节点的前一个节点并且记录下来
      CurNode = CurNode.next		#要删除的节点
      PreNode.next = CurNode.next		#将要删除节点的前一个指针指向要删除节点的下一个节点
      
      PreviousDelNodeNextNode
      要删除节点的前一个节点要删除的节点要删除节点的下一个节点
      代码目的:就是将Previous指针指向NextNode
  5. 环形链表的连接功能

    环形链表的连接并没有那么复杂,只需要改变两个指针就可以把两个环形链表连接在一起

    def concat(ptr1,ptr2):
    		head = ptr1.next		#任意在ptr1中找到一个节点当做head
    		ptr1.next = ptr2.next		#任意在ptr2中找到一个节点,ptr1指向ptr2任意一个节点的下一个节点
    		ptr2.next = head		#ptr2的下一个节点指向head(ptr1.next)
    		return ptr2
    
  • 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、付费专栏及课程。

余额充值