Skip to content

Commit 29cfeaf

Browse files
committed
Add remove-nth-node-from-end-of-list solution
1 parent 6df6de4 commit 29cfeaf

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace leetcode;
6+
7+
use leetcode\util\ListNode;
8+
9+
class RemoveNthNodeFromEndOfList
10+
{
11+
public static function removeNthFromEnd(?ListNode $head, int $n): ?ListNode
12+
{
13+
if (!$head) {
14+
return null;
15+
}
16+
$node = new ListNode();
17+
$node->next = $head;
18+
$slow = $fast = $node;
19+
for ($i = 1; $i <= $n + 1; $i++) {
20+
$fast = $fast->next;
21+
}
22+
while ($fast) {
23+
$slow = $slow->next;
24+
$fast = $fast->next;
25+
}
26+
$slow->next = $slow->next->next;
27+
28+
return $node->next;
29+
}
30+
31+
public static function removeNthFromEnd2(?ListNode $head, int $n): ?ListNode
32+
{
33+
if (!$head) {
34+
return null;
35+
}
36+
$slow = $fast = $head;
37+
for ($i = 0; $i < $n; $i++) {
38+
$fast = $fast->next;
39+
}
40+
if (!$fast) {
41+
return $head->next;
42+
}
43+
while ($fast->next) {
44+
$slow = $slow->next;
45+
$fast = $fast->next;
46+
}
47+
$slow->next = $slow->next->next;
48+
49+
return $head;
50+
}
51+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace leetcode\tests;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use leetcode\RemoveNthNodeFromEndOfList;
9+
use leetcode\util\ListNode;
10+
11+
class RemoveNthNodeFromEndOfListTest extends TestCase
12+
{
13+
public function testRemoveNthFromEnd(): void
14+
{
15+
$node1 = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5)))));
16+
$list1 = RemoveNthNodeFromEndOfList::removeNthFromEnd($node1, 2);
17+
self::assertSame([1, 2, 3, 5], ListNode::toArray($list1));
18+
19+
$node2 = new ListNode(1);
20+
$list2 = RemoveNthNodeFromEndOfList::removeNthFromEnd($node2, 1);
21+
self::assertSame([], ListNode::toArray($list2));
22+
23+
$node3 = new ListNode(1, new ListNode(2));
24+
$list3 = RemoveNthNodeFromEndOfList::removeNthFromEnd($node3, 1);
25+
self::assertSame([1], ListNode::toArray($list3));
26+
}
27+
28+
public function testRemoveNthFromEnd2(): void
29+
{
30+
$node1 = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5)))));
31+
$list1 = RemoveNthNodeFromEndOfList::removeNthFromEnd2($node1, 2);
32+
self::assertSame([1, 2, 3, 5], ListNode::toArray($list1));
33+
34+
$node2 = new ListNode(1);
35+
$list2 = RemoveNthNodeFromEndOfList::removeNthFromEnd2($node2, 1);
36+
self::assertSame([], ListNode::toArray($list2));
37+
38+
$node3 = new ListNode(1, new ListNode(2));
39+
$list3 = RemoveNthNodeFromEndOfList::removeNthFromEnd2($node3, 1);
40+
self::assertSame([1], ListNode::toArray($list3));
41+
}
42+
}

0 commit comments

Comments
 (0)