質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

663閲覧

cycled singly linked listのcycleがはじまったnodeを返すコードがインプット次第でアウトプットが異なる原因

sequelanonymous

総合スコア123

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/22 02:24

下記の問題に対して、間違えているコード がインプットデータが [1,2]0のときに失敗してしまいます。
原因をデバックをしながら特定しようとしていますが、見つけられずにいます。

もし、お気づきの点ありましたらご教示いただけませんしょうか?

Given the head of a linked list, return the node where the cycle begins. If there is no cycle, return null.

There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next pointer. Internally, pos is used to denote the index of the node that tail's next pointer is connected to (0-indexed). It is -1 if there is no cycle. Note that pos is not passed as a parameter.

Do not modify the linked list.

引用元: 142. Linked List Cycle II

間違えているコード

python

1# Definition for singly-linked list. 2# class ListNode: 3# def __init__(self, x): 4# self.val = x 5# self.next = None 6 7class Solution: 8 def detectCycle(self, head: ListNode) -> ListNode: 9 idx_table = {} 10 count = 0 11 12 while head: # node1, node2, node1 13 if idx_table.get(head, 0): # {}, {node1: 0}, {node1: 0, node2:1} 14 return head 15 16 idx_table[head] = count # {node1: 0}, {node1: 0, node2:1} 17 head = head.next # node2, node1 18 count+=1 # 1, 2

アウトプット1(失敗)

Your input [1,2] 0 Output tail connects to node index 1 Expected tail connects to node index 0

アウトプット2(成功)

Your input [3,2,0,-4] 1 Output tail connects to node index 1 Expected tail connects to node index 1

下記の書き方では正解できてはいます。

正解のコード1

python

1 2 seen = set() 3 while head: 4 if head in seen: 5 return head 6 seen.add(head) 7 head = head.next

正解のコード2

hash_map = {} while head: hash_map[head] = head if hash_map.get(head.next, 0): return head.next head = head.next

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2021/09/22 13:08

デバッグするんだったら、デバッグするための実行可能なコードが必要です。 与えられた入力から、循環を持つ連結リストを構築しないといけないし、 循環を検出した後、結果の表示もあったほうがいいでしょう。 デバッグしようとしているコード全体を質問に書いてください。
guest

回答1

0

ベストアンサー

原因は、間違っているコードで count = 0 としていることです。
各ノードに 0、1、2、... の番号を付与すると、
if idx_table.get(head, 0) で 0 が返ってきたときに
そのノード(head)が既に番号付けされたものかどうか判定できません。

count = 1 にするか、あるいは、idx_table[head] = count の前に
count += 1 を入れると正しくなるでしょう。

追記
count = 1 から始めて、各ノードに 1、2、3、... と番号を付ければいいのですが、
各ノードを 1、1、1、... としてもよいので、count += 1 は不要です。
dict を使って、key がノード、value が 1 ですが、その value は見ていません。
key が存在するかどうかだけを見ています。
ということで、dict を使う必要はなく、set で十分だということです。

投稿2021/09/22 13:34

編集2021/09/23 10:13
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sequelanonymous

2021/09/25 08:37

完全に私の見落としでした。ご指摘ありがとうございます!助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問