python实现链表操作,单链表python基本操作
目录一、快慢指针的概念二、快慢指针的应用2.1求中间值2.2删除倒数第二个节点2.3判断是否是循环链表。
一、快慢指针的概念
速度指针中的速度指的是移动的步数,即每次向前移动的速度。例如,在链表中,每次可以让快速指针向前移动两次,慢速指针向前移动一次。
如果我们要从上图的链表中删除一个值为10的节点,只需要设置两个指针。每次移动后,快速指针将比慢速指针多走一个节点,这就能形成一个指针间的差值,通过这个差值,来断开或者链接指针域,从而达到需要的结果。。
二、快慢指针的应用2.1求中间值思路:
设置一个快指针快,一个慢指针慢,假设快指针每次移动的速度是慢指针的两倍。当快指针到达尾节点指向None时,慢指针在链表的中间节点,从而确定中间节点的值。
图示:
慢速和快速指针都指向链表的第一个节点,然后慢速一次移动一个指针,快速一次移动两个指针。
代码示例:
class ListNode: def __init__(self,x,next=None):self . val=x self . next=next class解决方案:def deleteNode(self,Head: ListNode): slow=head #慢速指针fast=head #快速指针while fast and fast . next:slow=slow . next . next print(slow . val)if _ _ name _ _= _ _ main _ _ :a=list node(14,ListNode(23,ListNode(10,ListNode(35,ListNode(56,list node(list node
1.从底部删除第n个节点,意味着需要获取n-1的指针字段和n的指针字段。
2.设置快速指针和慢速指针。让快指针先走n 1步,再跟着慢指针走。当快速指针为None时,慢速指针仅停留在n-1。
思路:
图示:
#快慢指针classlistnode: def _ _ init _ _ (self,x,next=none):self . val=xself . next=next class solution:def kthtolast(self,head: listnode,K: int)-int: slow=head #慢速指针fast=head # The fast pointer while K10:fast=fast . next K-=1 while fast . next not none:fast=fast . next slow=slow . next=slow . next . next . next while head not n . one:print(head . val)head=head . next ListNode(3,ListNode(4,ListNode(5,))))obj=solution()node=obj . kthtolast(a,2) #结果是1,2,4,5 2.3。 判断是否是循环链表代码实例:。
在快指针和慢指针中,因为每次移动后,快指针会比慢指针多走一个节点,所以它们进入循环链表后,不管隔了多少个节点,慢指针总会被快指针追上,重合。这个时候就可以判断一定有戒指。
思路:
如果快速指针没有遍历,则没有环。
当慢指针和快指针相同时,环有节点。
图示:
Classnode: def _ _ init _ _ (self,val,next=None):self . val=valself . next=nextdef findbenogloop(head):slow=head #慢速指针fast=head #快速指针如果head为None: #判断链表是否为空。快回头。下一个!=无且快下一个下一个!=none:# fast ptr的下一个节点和下一个节点不为空。slow=slow . next fast=fast . next . next if slow==fast:#有一个环形结构print(有一个环形结构)当两个指针相遇时。break if _ _ name _ _= _ _ main _ _ :Node 1=节点(1) node2=节点(2) node3=节点(3) node4=节点(4) node5=节点(5)Node 1 . next=Node 2 Node 2 . next=Node 3 Node 3 . next=Node 4 Node 4 . next=Node 5 Node 5 . next=Node 2 findbeginofloop(Node 1)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。