Skip to content

Commit c823277

Browse files
authored
2024-12-25 v. 7.4.8: added "707. Design Linked List"
2 parents 87bbea8 + ac587d7 commit c823277

File tree

4 files changed

+151
-1
lines changed

4 files changed

+151
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,3 +612,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/).
612612
| 687. Longest Univalue Path | [Link](https://leetcode.com/problems/longest-univalue-path/) | [Link](./lib/medium/687_longest_univalue_path.rb) | [Link](./test/medium/test_687_longest_univalue_path.rb) |
613613
| 692. Top K Frequent Words | [Link](https://leetcode.com/problems/top-k-frequent-words/) | [Link](./lib/medium/692_top_k_frequent_words.rb) | [Link](./test/medium/test_692_top_k_frequent_words.rb) |
614614
| 701. Insert into a Binary Search Tree | [Link](https://leetcode.com/problems/insert-into-a-binary-search-tree/) | [Link](./lib/medium/701_insert_into_a_binary_search_tree.rb) | [Link](./test/medium/test_701_insert_into_a_binary_search_tree.rb) |
615+
| 707. Design Linked List | [Link](https://leetcode.com/problems/design-linked-list/) | [Link](./lib/medium/707_design_linked_list.rb) | [Link](./test/medium/test_707_design_linked_list.rb) |

leetcode-ruby.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ require 'English'
55
::Gem::Specification.new do |s|
66
s.required_ruby_version = '>= 3.0'
77
s.name = 'leetcode-ruby'
8-
s.version = '7.4.7'
8+
s.version = '7.4.8'
99
s.license = 'MIT'
1010
s.files = ::Dir['lib/**/*.rb'] + %w[README.md]
1111
s.executable = 'leetcode-ruby'
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
# frozen_string_literal: true
2+
3+
# https://leetcode.com/problems/design-linked-list/
4+
class MyLinkedList
5+
# Init
6+
def initialize
7+
@head = nil
8+
@length = 0
9+
end
10+
11+
# @param {Integer} index
12+
# @return {Integer}
13+
def get(index)
14+
return -1 unless is_valid_index(index)
15+
16+
node_at_index(index).val
17+
end
18+
19+
# @param {Integer} val
20+
# @return {Void}
21+
def add_at_head(val)
22+
new_head = ::MyLinkedList::InnerListNode.new(val)
23+
if @head
24+
prev = @head
25+
@head = new_head
26+
new_head.next = prev
27+
else
28+
@head = new_head
29+
end
30+
31+
@length += 1
32+
end
33+
34+
# @param {Integer} val
35+
# @return {Void}
36+
def add_at_tail(val)
37+
if @head
38+
tail = node_at_index(@length - 1)
39+
tail&.next = ::MyLinkedList::InnerListNode.new(val)
40+
else
41+
@head = ::MyLinkedList::InnerListNode.new(val)
42+
end
43+
44+
@length += 1
45+
end
46+
47+
# @param {Integer} index
48+
# @param {Integer} val
49+
# @return {Void}
50+
def add_at_index(index, val)
51+
if is_valid_index(index)
52+
if index.zero?
53+
add_at_head(val)
54+
else
55+
prev = node_at_index(index - 1)
56+
nxt = node_at_index(index)
57+
new_node = ::MyLinkedList::InnerListNode.new(val)
58+
prev.next = new_node
59+
new_node.next = nxt
60+
end
61+
62+
@length += 1
63+
elsif index == @length
64+
add_at_tail(val)
65+
end
66+
end
67+
68+
# @param {Integer} index
69+
# @return {Void}
70+
def delete_at_index(index)
71+
return unless is_valid_index(index)
72+
73+
if index.zero?
74+
if @head
75+
@head = @head.next
76+
@length -= 1
77+
end
78+
else
79+
prev = node_at_index(index - 1)
80+
prev.next = prev.next ? prev.next.next : nil
81+
@length -= 1
82+
end
83+
84+
puts(@length)
85+
end
86+
87+
# InnerListNode
88+
class InnerListNode
89+
attr_accessor :val, :next
90+
91+
# @param {Integer} val
92+
def initialize(val)
93+
@val = val
94+
@next = nil
95+
end
96+
end
97+
98+
private
99+
100+
# @param {Integer} index
101+
# @return {Boolean}
102+
def is_valid_index(index) = index >= 0 && index < @length
103+
104+
# @param {Integer} index
105+
# @return {ListNode}
106+
def node_at_index(index)
107+
return @head if index.zero?
108+
109+
target = @head
110+
position = 0
111+
until position == index
112+
target = target.next
113+
position += 1
114+
end
115+
116+
target
117+
end
118+
end
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# frozen_string_literal: true
2+
3+
require_relative '../test_helper'
4+
require_relative '../../lib/medium/707_design_linked_list'
5+
require 'minitest/autorun'
6+
7+
class DesignLinkedListTest < ::Minitest::Test
8+
def test_default_one
9+
my_linked_list = ::MyLinkedList.new
10+
my_linked_list.add_at_head(1)
11+
my_linked_list.add_at_tail(3)
12+
my_linked_list.add_at_index(1, 2)
13+
14+
assert_equal(2, my_linked_list.get(1))
15+
16+
my_linked_list.delete_at_index(1)
17+
18+
assert_equal(3, my_linked_list.get(1))
19+
end
20+
21+
def test_additional_one
22+
my_linked_list = ::MyLinkedList.new
23+
my_linked_list.add_at_tail(1)
24+
my_linked_list.add_at_index(0, 1)
25+
my_linked_list.delete_at_index(0)
26+
27+
assert_equal(1, my_linked_list.get(0))
28+
29+
my_linked_list.add_at_index(2, 2)
30+
end
31+
end

0 commit comments

Comments
 (0)