From 28c7a55f897b82d478b1d88c1badc961358401a8 Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Fri, 28 Feb 2020 10:59:20 -0700 Subject: [PATCH 1/2] day 465: cleaned up day 73 --- day465/problem.go | 22 +++++++++++++++++ day465/problem_test.go | 56 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 day465/problem.go create mode 100644 day465/problem_test.go diff --git a/day465/problem.go b/day465/problem.go new file mode 100644 index 0000000..944d5e9 --- /dev/null +++ b/day465/problem.go @@ -0,0 +1,22 @@ +package day465 + +// SinglyLL represents a node in a singly linked list. +type SinglyLL struct { + Value interface{} + Next *SinglyLL +} + +// ReverseSinglyLinkedList reverses a singly linked list in O(1) space +// and O(N) time. +func ReverseSinglyLinkedList(head *SinglyLL) *SinglyLL { + var reversed *SinglyLL + + for head != nil { + next := head.Next + head.Next = reversed + reversed = head + head = next + } + + return reversed +} diff --git a/day465/problem_test.go b/day465/problem_test.go new file mode 100644 index 0000000..076f8cd --- /dev/null +++ b/day465/problem_test.go @@ -0,0 +1,56 @@ +package day465 + +import "testing" + +// nolint +var testcases = []struct { + input []interface{} +}{ + {[]interface{}{"first", 2, "third", 4, "fifth", 6}}, + {[]interface{}{"foo", "bar", "baz"}}, + {[]interface{}{1, 2, 3}}, +} + +func createSinglyLL(data []interface{}) *SinglyLL { + head := &SinglyLL{} + current := head + + for _, value := range data { + current.Next = &SinglyLL{Value: value, Next: nil} + current = current.Next + } + + return head.Next +} + +func wasReversed(head *SinglyLL, data []interface{}) bool { + for i := range data { + if head == nil || head.Value != data[len(data)-1-i] { + return false + } + + head = head.Next + } + + return head == nil +} + +func TestReverseSinglyLinkedList(t *testing.T) { + t.Parallel() + + for _, tc := range testcases { + sll := createSinglyLL(tc.input) + if reversed := ReverseSinglyLinkedList(sll); !wasReversed(reversed, tc.input) { + t.Errorf("This list was not reversed correctly: %v", tc.input) + } + } +} + +func BenchmarkReverseSinglyLinkedList(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, tc := range testcases { + sll := createSinglyLL(tc.input) + ReverseSinglyLinkedList(sll) + } + } +} From f5f6f017615d53876d348759c890f7c36b23521b Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Fri, 28 Feb 2020 10:59:42 -0700 Subject: [PATCH 2/2] add day 465 to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 965fd7f..99b76d8 100644 --- a/README.md +++ b/README.md @@ -459,4 +459,5 @@ problems from * [Day 459](https://github.com/vaskoz/dailycodingproblem-go/issues/927) * [Day 460](https://github.com/vaskoz/dailycodingproblem-go/issues/929) * [Day 461](https://github.com/vaskoz/dailycodingproblem-go/issues/931) +* [Day 465](https://github.com/vaskoz/dailycodingproblem-go/issues/933)