Skip to content

Commit e204d72

Browse files
committed
added few linked list solution
1 parent d7c860d commit e204d72

File tree

4 files changed

+148
-1
lines changed

4 files changed

+148
-1
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
4+
struct ListNode
5+
{
6+
int val;
7+
ListNode *next;
8+
ListNode() : val(0), next(nullptr) {}
9+
ListNode(int x) : val(x), next(nullptr) {}
10+
ListNode(int x, ListNode *next) : val(x), next(next) {}
11+
};
12+
13+
ListNode* middleNode(ListNode* head) {
14+
ListNode* slow = head;
15+
ListNode* fast = head;
16+
17+
while (fast != nullptr && fast->next != nullptr) {
18+
slow = slow->next;
19+
fast = fast->next->next;
20+
}
21+
22+
return slow;
23+
}
24+
25+
struct testcase {
26+
ListNode* head;
27+
ListNode* expected;
28+
};
29+
30+
void test() {
31+
vector<testcase> testcases{
32+
(testcase) {new ListNode(1, new ListNode(1, new ListNode(2))), new ListNode(1, new ListNode(2))},
33+
(testcase) {new ListNode(1, new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(3))))), new ListNode(1, new ListNode(2, new ListNode(3)))},
34+
};
35+
for (int i = 0; i < testcases.size(); i++) {
36+
ListNode* result = deleteDuplicates(testcases[i].head);
37+
while (result != NULL) {
38+
assert(testcases[i].expected->val == result->val);
39+
result = result->next;
40+
testcases[i].expected = testcases[i].expected->next;
41+
}
42+
cout << "test" << i + 1 << ": PASSED\n";
43+
}
44+
}
45+
46+
int main() {
47+
test();
48+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Definition for singly-linked list.
2+
// #[derive(PartialEq, Eq, Clone, Debug)]
3+
// pub struct ListNode {
4+
// pub val: i32,
5+
// pub next: Option<Box<ListNode>>
6+
// }
7+
//
8+
// impl ListNode {
9+
// #[inline]
10+
// fn new(val: i32) -> Self {
11+
// ListNode {
12+
// next: None,
13+
// val
14+
// }
15+
// }
16+
// }
17+
impl Solution {
18+
pub fn middle_node(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
19+
let mut cursor = head.clone().unwrap();
20+
let mut count: usize = 0;
21+
22+
while cursor.next != None {
23+
count += 1;
24+
cursor = cursor.next.unwrap();
25+
}
26+
27+
let mut mid = if count % 2 == 0 {
28+
count / 2
29+
} else {
30+
(count / 2) + 1
31+
};
32+
33+
let mut new_cursor = head.unwrap();
34+
35+
while mid != 0 {
36+
mid -= 1;
37+
new_cursor = new_cursor.next.unwrap();
38+
}
39+
40+
Some(new_cursor)
41+
}
42+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
4+
struct ListNode
5+
{
6+
int val;
7+
ListNode *next;
8+
ListNode() : val(0), next(nullptr) {}
9+
ListNode(int x) : val(x), next(nullptr) {}
10+
ListNode(int x, ListNode *next) : val(x), next(next) {}
11+
};
12+
13+
ListNode* deleteDuplicates(ListNode* head) {
14+
ListNode* curr = head;
15+
16+
// exit when pointing at NULL
17+
while (curr != nullptr) {
18+
// [next elem is not NULL] and [curr elem is equals to next elem]
19+
while (curr->next != nullptr && curr->val == curr->next->val) {
20+
curr->next = curr->next->next;
21+
}
22+
// move to next elem
23+
curr = curr->next;
24+
}
25+
26+
return head;
27+
}
28+
29+
struct testcase {
30+
ListNode* head;
31+
ListNode* expected;
32+
};
33+
34+
void test() {
35+
vector<testcase> testcases{
36+
// [1,1,2] [1,2]
37+
(testcase) {new ListNode(1, new ListNode(1, new ListNode(2))), new ListNode(1, new ListNode(2))},
38+
// [1,1,2,3,3] [1,2,3]
39+
(testcase) {new ListNode(1, new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(3))))), new ListNode(1, new ListNode(2, new ListNode(3)))},
40+
// [1,1,1] [1]
41+
(testcase) {new ListNode(1, new ListNode(1, new ListNode(1))), new ListNode(1)},
42+
};
43+
for (int i = 0; i < testcases.size(); i++) {
44+
ListNode* result = deleteDuplicates(testcases[i].head);
45+
while (result != NULL) {
46+
assert(testcases[i].expected->val == result->val);
47+
result = result->next;
48+
testcases[i].expected = testcases[i].expected->next;
49+
}
50+
cout << "test" << i + 1 << ": PASSED\n";
51+
}
52+
}
53+
54+
int main() {
55+
test();
56+
}
57+

leetcode/linked_list/remove_nth_node_from_end_of_list/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ ListNode *removeNthFromEnd(ListNode *head, int n)
2525
slow->next = slow->next->next;
2626

2727
return head;
28-
}
28+
}

0 commit comments

Comments
 (0)