Skip to content

Commit

Permalink
issue-134: find loop linkedlist node
Browse files Browse the repository at this point in the history
  • Loading branch information
fengyuanyang committed Mar 14, 2021
1 parent 9e4a0f3 commit 4ede68d
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,45 @@ public static LinkedListNode partition(LinkedListNode node , int x) {

return leftNodeHead;
}

/**
* interview Question:
* Detect a loop linkedlist node
* Given a list node
* When node link as (A->B->C-D->B)
* Expect return B
* When node link as (C->D->A->B->E->D)
* Expect return C
*
* @param head
* @return
*/
public static LinkedListNode findLoopNode(LinkedListNode head) {
LinkedListNode slowNode = head;
LinkedListNode fastNode = head;

// find first meet node,
// k:(distance from list start to loop node start)
//
// number of nodes passed should be k + (circle length - mod(k, circle length))
while (fastNode != null && fastNode.hasNext()) {
slowNode = slowNode.next;
fastNode = fastNode.next.next;
if (slowNode == fastNode)
break;
}

// no meet
if (fastNode == null || fastNode.next == null)
return null;


slowNode = head;
while(slowNode != fastNode) {
slowNode = slowNode.next;
fastNode = fastNode.next;
}

return fastNode;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,29 @@ private static LinkedListNode generate(int... nodeValues) {
return node;
}

@ParameterizedTest
@MethodSource("findLoopNodeArguments")
void foundLoopNode(LinkedListNode<Integer> node, int loopNodeIndex) {
LinkedListNode loopNode = node;
for (int i=0;i<loopNodeIndex;i++) {
loopNode = loopNode.next;
}
LinkedListNode endNode = loopNode;
while(endNode.hasNext())
endNode = endNode.next;

endNode.next = loopNode;
LinkedListNode returnNode = util.findLoopNode(node);
Assertions.assertEquals(loopNode.getData(), returnNode.getData());
}

private static Stream<Arguments> findLoopNodeArguments() {
return Stream.of(
Arguments.of(generate(3, 5, 8, 4, 10, 2, 1), 5),
Arguments.of(generate(3, 11, 20, 7, 9, 10), 3),
Arguments.of(generate(20, 19, 23, 13, 6, 5, 0), 5),
Arguments.of(generate(20, 19, 23, 13, 6, 5, 0), 4),
Arguments.of(generate(20), 0)
);
}
}

0 comments on commit 4ede68d

Please sign in to comment.