v10
This commit is contained in:
204
test/structure/link_list/find.dart
Normal file
204
test/structure/link_list/find.dart
Normal file
@@ -0,0 +1,204 @@
|
||||
/// Dart、Rust 、C++ 、Java
|
||||
|
||||
void main() {
|
||||
ListNode listNode = ListNode(0, ListNode(3, ListNode(2, ListNode(8))));
|
||||
print(listNode);
|
||||
|
||||
// List<int> evens = listNode.getEvenValue();
|
||||
// print(evens);
|
||||
|
||||
// List<int> values = listNode.getValueByStep(2);
|
||||
// print(values);
|
||||
|
||||
// listNode.deleteAt(3);
|
||||
// ListNode? ret = listNode.deleteFromEnd(2);
|
||||
// print(ret);
|
||||
|
||||
// ListNode? middleNode1 = listNode.middleNode1();
|
||||
// print(middleNode1);
|
||||
|
||||
ListNode? middleNode2 = listNode.middleNode2();
|
||||
print(middleNode2);
|
||||
// ListNode? findNode = listNode.find(8);
|
||||
// if(findNode!=null){
|
||||
// ListNode? result = listNode.deleteNode(findNode);
|
||||
// // 0->2->8
|
||||
// print(result);
|
||||
// }
|
||||
}
|
||||
|
||||
class ListNode {
|
||||
int val;
|
||||
ListNode? next;
|
||||
ListNode([this.val = 0, this.next]);
|
||||
|
||||
//// region [2023.11.20]
|
||||
@override
|
||||
String toString() {
|
||||
ListNode? cur = this;
|
||||
String result = "";
|
||||
while (cur != null) {
|
||||
result = result + cur.val.toString();
|
||||
cur = cur.next;
|
||||
if (cur != null) {
|
||||
result += '->';
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
//// region [2023.11.21]
|
||||
/// [2023.11.21] TODO: 完成 find 函数,在链表中查找指定值的首位节点
|
||||
ListNode? find(int target) {
|
||||
ListNode? cur = this;
|
||||
while (cur != null) {
|
||||
if (cur.val == target) {
|
||||
return cur;
|
||||
}
|
||||
cur = cur.next;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// [2023.11.21]
|
||||
/// TODO: LeetCode 237 删除指定节点(非尾结点)
|
||||
void deleteNodeNotLast(ListNode node) {
|
||||
if (node.next != null) {
|
||||
node.val = node.next!.val;
|
||||
node.next = node.next?.next;
|
||||
}
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
//// region [2023.11.22]
|
||||
/// [2023.11.22]
|
||||
/// TODO: 完成 size 方法,返回链表长度
|
||||
int size() {
|
||||
int i = 0;
|
||||
ListNode? cur = this;
|
||||
while (cur != null) {
|
||||
cur = cur.next;
|
||||
i++;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/// [2023.11.22]
|
||||
/// TODO: 完成 deleteAt 方法,删除第 index 个节点
|
||||
void deleteAt(int index) {
|
||||
if (index == 0) {
|
||||
ListNode? next = this.next;
|
||||
this.val = next?.val ?? -1;
|
||||
this.next = next?.next;
|
||||
next?.next = null;
|
||||
return;
|
||||
}
|
||||
|
||||
ListNode? cur = this;
|
||||
for (int i = 0; i < index - 1; i++) {
|
||||
cur = cur?.next;
|
||||
}
|
||||
ListNode? target = cur?.next;
|
||||
cur?.next = target?.next;
|
||||
target?.next = null;
|
||||
}
|
||||
|
||||
/// [2023.11.22]
|
||||
/// TODO: LeetCode 19 删除链表的倒数第 N 个节点
|
||||
ListNode? deleteFromEnd(int n) {
|
||||
ListNode? dummy = ListNode(0, this);
|
||||
ListNode? first = this;
|
||||
ListNode? second = dummy;
|
||||
for (int i = 0; i < n; ++i) {
|
||||
first = first?.next;
|
||||
}
|
||||
while (first != null) {
|
||||
first = first.next;
|
||||
second = second?.next;
|
||||
}
|
||||
second?.next = second.next?.next;
|
||||
return dummy.next;
|
||||
}
|
||||
|
||||
ListNode? deleteNode(ListNode node) {
|
||||
ListNode? cur = this;
|
||||
if (cur == node) {
|
||||
cur = cur.next!;
|
||||
return cur;
|
||||
}
|
||||
while (cur != null) {
|
||||
if (cur.next == node) {
|
||||
cur.next = cur.next?.next;
|
||||
return this;
|
||||
}
|
||||
cur = cur.next;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
//// region [2023.11.23]
|
||||
/// [2023.11.23]
|
||||
/// TODO: 完成 getEvenValue 方法,
|
||||
/// 返回链表中偶数节点的值列表
|
||||
List<int> getEvenValue() {
|
||||
ListNode? cur = this;
|
||||
List<int> result = [];
|
||||
|
||||
while (cur != null) {
|
||||
result.add(cur.val);
|
||||
cur = cur.next?.next;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// TODO: 完成 getValueByStep 方法,
|
||||
/// 返回链表中每隔 step 个节点的值列表
|
||||
/// 例:
|
||||
/// 链表: 0->3->2->8->9
|
||||
/// step=3 : 输出 [0, 8]
|
||||
/// step=2 : 输出 [0, 2, 9]
|
||||
List<int> getValueByStep(int step) {
|
||||
ListNode? cur = this;
|
||||
List<int> result = [];
|
||||
|
||||
while (cur != null) {
|
||||
result.add(cur.val);
|
||||
for (int i = 0; i < step; i++) {
|
||||
cur = cur?.next;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// [2023.11.23]
|
||||
/// TODO: LeetCode 876 链表的中间结点
|
||||
/// [1,2,3,4,5] -> [3,4,5]
|
||||
/// [1,2,3,4,5,6] -> [4,5,6]
|
||||
/// 时间 O(N) 空间 O(N)
|
||||
ListNode? middleNode1() {
|
||||
List<ListNode?> nodes = [];
|
||||
ListNode? cur = this;
|
||||
while (cur != null) {
|
||||
nodes.add(cur);
|
||||
cur = cur.next;
|
||||
}
|
||||
return nodes[nodes.length ~/ 2];
|
||||
}
|
||||
|
||||
/// 使用快慢指针 - 一次遍历
|
||||
ListNode? middleNode2() {
|
||||
ListNode? slow = this;
|
||||
ListNode? fast = this;
|
||||
while (fast != null && fast.next != null) {
|
||||
slow = slow?.next;
|
||||
fast = fast.next?.next;
|
||||
}
|
||||
return slow;
|
||||
}
|
||||
// endregion
|
||||
}
|
||||
3
test/structure/link_list/linked_list.dart
Normal file
3
test/structure/link_list/linked_list.dart
Normal file
@@ -0,0 +1,3 @@
|
||||
class LikedList<T>{
|
||||
|
||||
}
|
||||
@@ -23,7 +23,4 @@ class ListNode {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user