1.链表有无环(面试常考):
思路1:集合操作
利用集合元素唯一性的特点,从链表的头部开始遍历,依次将结点放入集合中,并且每放入一个结点都需判断该集合的长度与前一次放入结点时有无变化,如果长度没有变化,则说明链表有环,如果遍历到尾结点,链表的长度均依次递增,说明链表没有环。
例题:leetcode141.
代码(python
):
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head: ListNode) -> bool:
nodes = set()
size = len(nodes)
flag = False
while head != None:
nodes.add(head)
if len(nodes) == size:
flag = True
break
size = len(nodes)
head = head.next
return flag
思路2:快慢指针(推荐)
定义两个指针,其中一个指针一次移动一个结点(.next
)我们称之为慢指针,另外一个指针一次移动两个结点(.next.next
)我们称之为快指针,若慢指针追上了快指针则说明链表有环;如果快指针到达了链表尾结点,慢指针都没有追上快指针,则说明链表没有环。
例题:leetcode141.
代码(java
):
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode slow=head;
ListNode fast=head;
boolean flag=false;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(slow==fast){
flag=true;
break;
}
}
return flag;
}
}