1.解题思路
判断一个链表是否存在环行结构,一般看这个题目就会想到暴力解法,从头遍历到尾,看头是否与尾相等。但面试官肯定不会想要这种答案的。这种暴力解法也是存在bug的,如果链表尾部是和链表中间某个元素形成环,这种暴力解法就判断不了了。所以的有更好解法,
2.解法:警察抓小偷,警察走两步,小偷走一步,如果链表是环型结构,警察就一定会抓到小偷。定义两个Node一个取next ,一个取next.next,最后判断这两个元素是否相等。
3.实现:
class NodeTest {
class ListNode(val value: Int) {
var next: ListNode? = null
}
//判断链表是否有环
fun judgeNodeLoop(n: ListNode): Boolean {
var next = n.next
var pNext : ListNode? = next?.next
while (next != null || pNext != null) {
if (pNext == next) {
return true
}
next = next?.next
pNext = pNext?.next?.next
}
return false
}
}
在main方法中测试一下
@JvmStatic
fun main(args: Array<String>) {
val node = NodeTest.ListNode(1)
val node2 = NodeTest.ListNode(2)
val node3 = NodeTest.ListNode(3)
val node4 = NodeTest.ListNode(4)
val node5 = NodeTest.ListNode(5)
val node6 = NodeTest.ListNode(6)
node.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
node5.next = node6
node6.next = node
val isLoop = NodeTest().judgeNodeLoop(node)
println(isLoop)
}
打印 true