leetcode演算法題解(Java版)-7-迴圈連結串列
一、迴圈連結串列
題目描述
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
思路
- 不能用多餘空間,剛開始沒有考慮多個指標什麼,一下子想到個歪點子:迴圈就是重複走,那我可以標記一下每次走過的路,如果遇到標記過的路,那說明就是有迴路了。
程式碼一
/**
* 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) {
if(head==null){
return false;
}
ListNode p=new ListNode(0);
p=head;
int u=-987123;
while(p.val!=u&&p.next!=null){
p.val=u;
p=p.next;
}
if(p.val==u){
return true;
}
else{
return false;
}
}
}
思路二
- 當然標準的是應該用兩個指標來“追趕”,前提是這兩個指標走的速度不一樣,一前一後如果相遇了則說明有迴路。
程式碼二
/**
* 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) {
if(head==null){
return false;
}
ListNode p=head;
ListNode q=head.next;
while(p!=q&&q!=null&&p!=null){
q=q.next;
if(q!=null){
q=q.next;
}
p=p.next;
}
if(p==q&&p!=null){
return true;
}
else{
return false;
}
}
}
優化過的程式碼:
/**
* 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) {
if(head==null){
return false;
}
ListNode fastNode=head;
ListNode lowNode=head;
while(fastNode!=null&&fastNode.next!=null){
fastNode=fastNode.next.next;
lowNode=lowNode.next;
if(fastNode==lowNode){
return true;
}
}
return false;
}
}
今天有場考試,到七點半才結束,就刷這麼多了。
相關文章
- 連結串列-迴圈連結串列
- LeetCode 連結串列解題彙總 Java版LeetCodeJava
- 【LeetCode】 Rotate List 迴圈連結串列LeetCode
- 連結串列4: 迴圈連結串列
- 單向迴圈連結串列
- 資料結構與演算法--迴圈連結串列資料結構演算法
- 單鏈迴圈連結串列(初版
- 複習下C 連結串列操作(雙向迴圈連結串列,查詢迴圈節點)
- leetcode 234.迴文連結串列 JavaLeetCodeJava
- 資料結構之迴圈連結串列資料結構
- Java演算法面試題(001) 如何使用迴圈和遞迴計算單連結串列的長度Java演算法面試題遞迴
- 單向迴圈連結串列大綱
- 迴圈連結串列(約瑟夫問題)--python實現Python
- 【資料結構與演算法學習】線性表(順序表、單連結串列、雙向連結串列、迴圈連結串列)資料結構演算法
- Josephus問題解決方法三(單向迴圈連結串列標識法)
- 單向迴圈連結串列的介面程式
- 單向迴圈連結串列的實現
- 實戰資料結構(4)_迴圈單連結串列解決約瑟夫問題資料結構
- 【資料結構】雙迴圈連結串列(c++)資料結構C++
- 【LeetCode-連結串列】面試題-反轉連結串列LeetCode面試題
- 設計單向迴圈連結串列的介面
- LeetCode連結串列專題LeetCode
- javascript中使用迴圈連結串列實現約瑟夫環問題JavaScript
- LeetCode 234. 迴文連結串列LeetCode
- JS資料結構第三篇---雙向連結串列和迴圈連結串列之約瑟夫問題JS資料結構
- 【資料結構】實現迴圈連結串列(c++)資料結構C++
- #反轉連結串列_C++版 #反轉連結串列_Java版 @FDDLCC++Java
- 雙向迴圈連結串列的介面設計(初版
- Java版-資料結構-連結串列Java資料結構
- 資料結構學習(C++)——迴圈連結串列 (轉)資料結構C++
- 單向迴圈連結串列——查詢、刪除、插入結點
- 雙向迴圈連結串列————遍歷、查詢、插入結點
- 資料結構與演算法(二) -- 線性表之單向迴圈連結串列資料結構演算法
- 【LeetCode】初級演算法:連結串列LeetCode演算法
- 單連結串列逆置遞迴演算法遞迴演算法
- 【圖解連結串列類面試題】移除連結串列元素圖解面試題
- 【圖解連結串列類面試題】環形連結串列圖解面試題
- Leetcode_86_分割連結串列_連結串列LeetCode