本文主要是介绍判断是否:1)循环链表;2)链表有环,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1 判断是否为循环链表:
普通链表的尾指针为空,循环单链表的尾指针为头结点。
/*
*fun:JudgeCircularList_L()
*desc:判断单链线性表L是否为循环链表,若是则返回OK,否则返回ERROR
*@param: L LinkList 头指针的引用
*@ret:OK/ERROR int
*/
Status JudgeCircularList_L(LinkList &L)
{if(!L||!L->next) return ERROR; //空指针或者单链表为空表LinkList tail,first;first=L->next;tail=first->next;while(tail&&tail!=first){tail=tail->next;}if(!tail) return ERROR;else return OK;
}
2 判断链表是否有环?如果链表为存在环,如果找到环的入口点?
用一个快慢指针:
首先创建两个指针1和2(在java里就是两个对象引用),同时指向这个链表的头节点。然后开始一个大循环,在循环体中,让指针1每次向下移动一个节点,让指针2每次向下移动两个节点,然后比较两个指针指向的节点是否相同。如果相同,则判断出链表有环,如果不同,则继续下一次循环。
此方法也可以用一个更生动的例子来形容:在一个环形跑道上,两个运动员在同一地点起跑,一个运动员速度快,一个运动员速度慢。当两人跑了一段时间,速度快的运动员必然会从速度慢的运动员身后再次追上并超过,原因很简单,因为跑道是环形的。
class Node(): #定义一个Node类,构造两个属性,一个是item节点值,一个是节点的下一个指向def __init__(self,item=None):self.item = itemself.next = Nonedef findbeginofloop(head):#判断是否为环结构并且查找环结构的入口节点slowPtr = head #将头节点赋予slowPtrfastPtr = head #将头节点赋予fastPtrloopExist =False #默认环不存在,为Falseif head == None: #如果头节点就是空的,那肯定就不存在环结构return Falsewhile fastPtr.next != None and fastPtr.next.next != None: #fastPtr的下一个节点和下下个节点都不为空slowPtr = slowPtr.next #slowPtr每次移动一个节点fastPtr = fastPtr.next.next #fastPtr每次移动两个节点 if slowPtr == fastPtr : #当fastPtr和slowPtr的节点相同时,也就是两个指针相遇了loopExist = Trueprint("存在环结构")breakif loopExist == True:slowPtr = headwhile slowPtr != fastPtr:fastPtr = fastPtr.nextslowPtr = slowPtr.nextreturn slowPtrprint("不是环结构")return Falseif __name__ == "__main__":node1 = Node(1)node2 = Node(2)node3 = Node(3)node4 = Node(4)node5 = Node(5)node1.next = node2node2.next = node3node3.next = node4node4.next = node5node5.next = node2print(findbeginofloop(node1).item)
后面参考: https://blog.csdn.net/yangnianjinxin/article/details/79025768
这篇关于判断是否:1)循环链表;2)链表有环的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!