Skip to content

Commit e632fb0

Browse files
authored
Merge pull request #31 from rihib/linked_list_cycle
Linked List Cycle
2 parents 40c1c2f + 808207c commit e632fb0

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package linkedlistcycle
3+
4+
type ListNode struct {
5+
Val int
6+
Next *ListNode
7+
}
8+
9+
/*
10+
レビュワーの方へ:
11+
- このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347
12+
*/
13+
14+
/*
15+
時間:5分
16+
17+
この問題を見たことがあり、フロイドの循環検出法を知っていたため、その方法で解いてみた。
18+
`slow == fast`ではポインタ同士を比較しているため、同一のオブジェクトであることを確認できる。
19+
*/
20+
func hasCycleFloyd(head *ListNode) bool {
21+
slow, fast := head, head
22+
for fast != nil && fast.Next != nil {
23+
slow, fast = slow.Next, fast.Next.Next
24+
if slow == fast {
25+
return true
26+
}
27+
}
28+
return false
29+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package linkedlistcycle
3+
4+
/*
5+
レビュワーの方へ:
6+
- このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347
7+
*/
8+
9+
/*
10+
他に既に訪ねたノードのリストを保持しておく方法も考えられる。
11+
ノードのポインタ(メモリアドレス)をキーとしている。
12+
*/
13+
func hasCycleMap(head *ListNode) bool {
14+
seen := make(map[*ListNode]struct{})
15+
node := head
16+
for node != nil {
17+
if _, ok := seen[node]; ok {
18+
return true
19+
}
20+
seen[node] = struct{}{}
21+
node = node.Next
22+
}
23+
return false
24+
}

0 commit comments

Comments
 (0)