141. Linked List Cycle
问题:给定单链表,判断是否存在环。
要求:不使用额外空间。
判断方法:
1、从链表头开始遍历整个链表,并且记录已经遍历过的结点地址,如果发现有正在遍历的结点是已经遍历过的,则说明是存在环的。但是这种方式就需要使用额外的空间来存放遍历过的结点地址。
2、设置两个指针,p和q,p从链表头开始,每次向前走一步,而q每次都从链表头开始,走到p会到达的结点,若p的累计步数和q每次的步数都一致,那么就不存在环,反之,则存在环。
3、设置两个指针,快指针p和慢指针q,两个指针都从链表头开始,p每次向前走两步,q每次向前走1步,若p始终在q的前面直到到达链表尾,那么就不存在环,若p和q在某一个结点相遇,那么说明存在环。
需要注意的地方:
1、对于单向链表,每个结点都只有一个直接后继结点。
2、Line 18: error: illegal character: ‘\uff1b’ 这种错误代表是使用的中文标点符号。
自己写的1:(java)
这个是根据方法2来写的代码,但是存在一个问题就是当链表很长时,越到后面,每一次循环的时间会越长,因此会导致时间复杂度很大。
/**
* 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 p;
ListNode q;
p = head;
q = head;
if(head==null || head.next==null){
return false;
}
int pStep = 0;
int resultTag = 0;
System.out.println(head.next);
while (p.next != null) {
p = p.next;
pStep = pStep + 1;
int qStep = 0;
for (qStep = 0; q.next == p.next; qStep++) {
q = q.next;
System.out.println(11);
}
if (pStep != qStep) {
resultTag = 1;
break;
}
}
if (resultTag == 1) {
return true;
}
else {
return false;
}
}
}
自己写的2:(java)
这个是根据方法3来写的代码:
/**
* 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 p;
ListNode q;
p = head;
q = head;
if(p==null || p.next==null || p.next.next==null){
return false;
}
int pStep = 0;
int resultTag = 0;
System.out.println(head.next);
while (p.next != null && p.next.next != null) {
p = p.next.next;
q = q.next;
if (p == q) {
resultTag = 1;
break;
}
}
if (resultTag == 1) {
return true;
}
else {
return false;
}
}
}