数据结构-链表-环形链表
环形链表就是将单链表的尾部指向头部,从而形成一个单方向的环形结构,环形链表中每个元素都可以是head,也都可以是尾部,这样就不用担心链表头指针遗失的问题,而且在遍历链表的时候可以在任一节点来遍历其他节点
-
环形链表的建立
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 #存取指针设置为新元素所在的位置
-
环形链表的遍历
与单向链表的遍历十分相似,只不过单向链表的结束条件是ptr.next = None,而环形链表的结束条件是ptr.next = head
ptr = head while True: print(ptr.name,ptr.no) ptr = ptr.next #将head移到后一个元素 if ptr.next == head: break
-
在环形链表中插入新节点
因为环形链表中每一个元素指针都是指向一下个节点,所以没有所谓的从链表尾部插入的问题,通常只有两种情况:
-
将新节点插在第一个节点前成为链表头部:首先将新节点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
-
-
环形链表中删除节点
环形链表的删除和插入方法类似,也可以分为两种情况
-
删除环形链表的第一个节点:首先将链表头指针移到下一个节点,将最后一个节点的指针指向新的链表头部,新的链表头部就是原链表的第二个节点
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 #将要删除节点的前一个指针指向要删除节点的下一个节点
Previous DelNode NextNode 要删除节点的前一个节点 要删除的节点 要删除节点的下一个节点 代码目的:就是将Previous指针指向NextNode
-
-
环形链表的连接功能
环形链表的连接并没有那么复杂,只需要改变两个指针就可以把两个环形链表连接在一起
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