@@ -2,10 +2,13 @@ package goutils
2
2
3
3
import (
4
4
"encoding/json"
5
+ "errors"
5
6
"strconv"
6
7
"strings"
7
8
)
8
9
10
+ var ErrInfiniteLoop = errors .New ("infinite loop detected" )
11
+
9
12
/*
10
13
Much appreciated to EndlessCheng
11
14
Adapted from https://github.com/EndlessCheng/codeforces-go/blob/ae5b312f3f/leetcode/testutil/leetcode.go
@@ -36,14 +39,23 @@ func DeserializeListNode(s string) (*ListNode, error) {
36
39
return root , nil
37
40
}
38
41
42
+ // ToString returns a string representation of the linked list.
43
+ // It panics with ErrInfiniteLoop if a cycle is detected.
39
44
func (l * ListNode ) ToString () string {
45
+ seen := make (map [* ListNode ]bool , 10 )
46
+
40
47
sb := & strings.Builder {}
41
48
sb .WriteByte ('[' )
42
49
for ; l != nil ; l = l .Next {
43
50
if sb .Len () > 1 {
44
51
sb .WriteByte (',' )
45
52
}
46
53
sb .WriteString (strconv .Itoa (l .Val ))
54
+
55
+ if seen [l ] {
56
+ panic (ErrInfiniteLoop )
57
+ }
58
+ seen [l ] = true
47
59
}
48
60
sb .WriteByte (']' )
49
61
return sb .String ()
@@ -104,13 +116,21 @@ func DeserializeTreeNode(s string) (*TreeNode, error) {
104
116
return root , nil
105
117
}
106
118
119
+ // ToString returns a string representation of the binary tree.
120
+ // It panics with ErrInfiniteLoop if a cycle is detected.
107
121
func (t * TreeNode ) ToString () string {
108
122
nodes := []* TreeNode {}
109
123
queue := []* TreeNode {t }
124
+ seen := make (map [* TreeNode ]bool , 10 )
110
125
for len (queue ) > 0 {
111
126
t , queue = queue [0 ], queue [1 :]
112
127
nodes = append (nodes , t )
113
128
if t != nil {
129
+ if seen [t ] {
130
+ panic (ErrInfiniteLoop )
131
+ }
132
+ seen [t ] = true
133
+
114
134
queue = append (queue , t .Left , t .Right )
115
135
}
116
136
}
@@ -164,16 +184,24 @@ func DeserializeNaryTreeNode(s string) (*NaryTreeNode, error) {
164
184
return root .Children [0 ], nil
165
185
}
166
186
187
+ // ToString returns a string representation of the nary tree.
188
+ // It panics with ErrInfiniteLoop if a cycle is detected.
167
189
func (t * NaryTreeNode ) ToString () string {
168
190
nodes := []* NaryTreeNode {}
169
191
q := []* NaryTreeNode {{Children : []* NaryTreeNode {t }}}
192
+ seen := make (map [* NaryTreeNode ]bool , 10 )
170
193
171
194
for len (q ) > 0 {
172
195
node := q [0 ]
173
196
q = q [1 :]
174
197
nodes = append (nodes , node )
175
198
176
199
if node != nil {
200
+ if seen [node ] {
201
+ panic (ErrInfiniteLoop )
202
+ }
203
+ seen [node ] = true
204
+
177
205
if len (node .Children ) > 0 {
178
206
q = append (q , node .Children ... )
179
207
}
0 commit comments