forked from krahets/hello-algo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request krahets#125 from mingXta/linked-list
Add C# linkedlist doc and code,modify some formatting.
- Loading branch information
Showing
6 changed files
with
297 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
.idea/ | ||
.vs/ | ||
obj/ | ||
.Debug | ||
bin/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,16 @@ | ||
/* | ||
* File: Array.cs | ||
* Created Time: 2022-12-14 | ||
* Author: mingXta ([email protected]) | ||
*/ | ||
// File: Array.cs | ||
// Created Time: 2022-12-14 | ||
// Author: mingXta ([email protected]) | ||
|
||
using NUnit.Framework; | ||
|
||
namespace hello_algo.chapter_array_and_linkedlist | ||
{ | ||
public class Array | ||
{ | ||
/* 随机返回一个数组元素 */ | ||
/// <summary> | ||
/// 随机返回一个数组元素 | ||
/// </summary> | ||
public static int RandomAccess(int[] nums) | ||
{ | ||
Random random = new(); | ||
|
@@ -17,7 +19,9 @@ public static int RandomAccess(int[] nums) | |
return randomNum; | ||
} | ||
|
||
/* 扩展数组长度 */ | ||
/// <summary> | ||
/// 扩展数组长度 | ||
/// </summary> | ||
public static int[] Extend(int[] nums, int enlarge) | ||
{ | ||
// 初始化一个扩展长度后的数组 | ||
|
@@ -31,7 +35,9 @@ public static int[] Extend(int[] nums, int enlarge) | |
return res; | ||
} | ||
|
||
/* 在数组的索引 index 处插入元素 num */ | ||
/// <summary> | ||
/// 在数组的索引 index 处插入元素 num | ||
/// </summary> | ||
public static void Insert(int[] nums, int num, int index) | ||
{ | ||
// 把索引 index 以及之后的所有元素向后移动一位 | ||
|
@@ -43,7 +49,9 @@ public static void Insert(int[] nums, int num, int index) | |
nums[index] = num; | ||
} | ||
|
||
/* 删除索引 index 处元素 */ | ||
/// <summary> | ||
/// 删除索引 index 处元素 | ||
/// </summary> | ||
public static void Remove(int[] nums, int index) | ||
{ | ||
// 把索引 index 之后的所有元素向前移动一位 | ||
|
@@ -53,7 +61,9 @@ public static void Remove(int[] nums, int index) | |
} | ||
} | ||
|
||
/* 遍历数组 */ | ||
/// <summary> | ||
/// 遍历数组 | ||
/// </summary> | ||
public static void Traverse(int[] nums) | ||
{ | ||
int count = 0; | ||
|
@@ -69,7 +79,9 @@ public static void Traverse(int[] nums) | |
} | ||
} | ||
|
||
/* 在数组中查找指定元素 */ | ||
/// <summary> | ||
/// 在数组中查找指定元素 | ||
/// </summary> | ||
public static int Find(int[] nums, int target) | ||
{ | ||
for (int i = 0; i < nums.Length; i++) | ||
|
@@ -80,43 +92,46 @@ public static int Find(int[] nums, int target) | |
return -1; | ||
} | ||
|
||
/*辅助函数,数组转字符串 */ | ||
/// <summary> | ||
/// 辅助函数,数组转字符串 | ||
/// </summary> | ||
public static string ToString(int[] nums) | ||
{ | ||
return string.Join(",", nums); | ||
} | ||
|
||
/* Driver Code */ | ||
public static void Main() | ||
|
||
// Driver Code | ||
[Test] | ||
public static void Test() | ||
{ | ||
/* 初始化数组 */ | ||
// 初始化数组 | ||
int[] arr = new int[5]; | ||
Console.WriteLine("数组 arr = " + ToString(arr)); | ||
int[] nums = { 1, 3, 2, 5, 4 }; | ||
Console.WriteLine("数组 nums = " + ToString(nums)); | ||
|
||
/* 随机访问 */ | ||
// 随机访问 | ||
int randomNum = RandomAccess(nums); | ||
Console.WriteLine("在 nums 中获取随机元素 " + randomNum); | ||
|
||
/* 长度扩展 */ | ||
// 长度扩展 | ||
nums = Extend(nums, 3); | ||
Console.WriteLine("将数组长度扩展至 8 ,得到 nums = " + ToString(nums)); | ||
|
||
/* 插入元素 */ | ||
// 插入元素 | ||
Insert(nums, 6, 3); | ||
Console.WriteLine("在索引 3 处插入数字 6 ,得到 nums = " + ToString(nums)); | ||
|
||
/* 删除元素 */ | ||
// 删除元素 | ||
Remove(nums, 2); | ||
Console.WriteLine("删除索引 2 处的元素,得到 nums = " + ToString(nums)); | ||
|
||
/* 遍历数组 */ | ||
// 遍历数组 | ||
Traverse(nums); | ||
|
||
/* 查找元素 */ | ||
// 查找元素 | ||
int index = Find(nums, 3); | ||
Console.WriteLine("在 nums 中查找元素 3 ,得到索引 = " + index); | ||
} | ||
} | ||
} | ||
} |
100 changes: 100 additions & 0 deletions
100
codes/csharp/chapter_array_and_linkedlist/LinkedList.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
// File: LinkedList.cs | ||
// Created Time: 2022-12-16 | ||
// Author: mingXta ([email protected]) | ||
|
||
using hello_algo.include; | ||
using NUnit.Framework; | ||
|
||
namespace hello_algo.chapter_array_and_linkedlist | ||
{ | ||
public class LinkedList | ||
{ | ||
/// <summary> | ||
/// 在链表的结点 n0 之后插入结点 P | ||
/// </summary> | ||
public static void Insert(ListNode n0, ListNode P) | ||
{ | ||
ListNode n1 = n0.next; | ||
n0.next = P; | ||
P.next = n1; | ||
} | ||
|
||
/// <summary> | ||
/// 删除链表的结点 n0 之后的首个结点 | ||
/// </summary> | ||
public static void Remove(ListNode n0) | ||
{ | ||
if (n0.next == null) | ||
return; | ||
// n0 -> P -> n1 | ||
ListNode P = n0.next; | ||
ListNode n1 = P.next; | ||
n0.next = n1; | ||
} | ||
|
||
/// <summary> | ||
/// 访问链表中索引为 index 的结点 | ||
/// </summary> | ||
public static ListNode Access(ListNode head, int index) | ||
{ | ||
for (int i = 0; i < index; i++) | ||
{ | ||
head = head.next; | ||
if (head == null) | ||
return null; | ||
} | ||
return head; | ||
} | ||
|
||
/// <summary> | ||
/// 在链表中查找值为 target 的首个结点 | ||
/// </summary> | ||
public static int Find(ListNode head, int target) | ||
{ | ||
int index = 0; | ||
while (head != null) | ||
{ | ||
if (head.val == target) | ||
return index; | ||
head = head.next; | ||
index++; | ||
} | ||
return -1; | ||
} | ||
|
||
// Driver Code | ||
[Test] | ||
public void Test() | ||
{ | ||
// 初始化链表 | ||
// 初始化各个结点 | ||
ListNode n0 = new ListNode(1); | ||
ListNode n1 = new ListNode(3); | ||
ListNode n2 = new ListNode(2); | ||
ListNode n3 = new ListNode(5); | ||
ListNode n4 = new ListNode(4); | ||
// 构建引用指向 | ||
n0.next = n1; | ||
n1.next = n2; | ||
n2.next = n3; | ||
n3.next = n4; | ||
Console.WriteLine($"初始化的链表为{n0}"); | ||
|
||
// 插入结点 | ||
Insert(n0, new ListNode(0)); | ||
Console.WriteLine($"插入结点后的链表为{n0}"); | ||
|
||
// 删除结点 | ||
Remove(n0); | ||
Console.WriteLine($"删除结点后的链表为{n0}"); | ||
|
||
// 访问结点 | ||
ListNode node = Access(n0, 3); | ||
Console.WriteLine($"链表中索引 3 处的结点的值 = {node.val}"); | ||
|
||
// 查找结点 | ||
int index = Find(n0, 2); | ||
Console.WriteLine($"链表中值为 2 的结点的索引 = {index}"); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<OutputType>Exe</OutputType> | ||
<TargetFramework>net6.0</TargetFramework> | ||
<RootNamespace>hello_algo</RootNamespace> | ||
<ImplicitUsings>enable</ImplicitUsings> | ||
<Nullable>enable</Nullable> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.0" /> | ||
<PackageReference Include="NUnit" Version="3.13.3" /> | ||
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0" /> | ||
<PackageReference Include="coverlet.collector" Version="3.1.0" /> | ||
</ItemGroup> | ||
|
||
</Project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
// File: ListNode.cs | ||
// Created Time: 2022-12-16 | ||
// Author: mingXta ([email protected]) | ||
|
||
namespace hello_algo.include | ||
{ | ||
/// <summary> | ||
/// Definition for a singly-linked list node | ||
/// </summary> | ||
public class ListNode | ||
{ | ||
public int val; | ||
public ListNode next; | ||
|
||
/// <summary> | ||
/// Generate a linked list with an array | ||
/// </summary> | ||
/// <param name="x"></param> | ||
public ListNode(int x) | ||
{ | ||
val = x; | ||
} | ||
|
||
/// <summary> | ||
/// Generate a linked list with an array | ||
/// </summary> | ||
/// <param name="arr"></param> | ||
/// <returns></returns> | ||
public static ListNode ArrToLinkedList(int[] arr) | ||
{ | ||
ListNode dum = new ListNode(0); | ||
ListNode head = dum; | ||
foreach (int val in arr) | ||
{ | ||
head.next = new ListNode(val); | ||
head = head.next; | ||
} | ||
return dum.next; | ||
} | ||
|
||
/// <summary> | ||
/// Get a list node with specific value from a linked list | ||
/// </summary> | ||
/// <param name="head"></param> | ||
/// <param name="val"></param> | ||
/// <returns></returns> | ||
public static ListNode GetListNode(ListNode head, int val) | ||
{ | ||
while (head != null && head.val != val) | ||
{ | ||
head = head.next; | ||
} | ||
return head; | ||
} | ||
|
||
public override string? ToString() | ||
{ | ||
List<string> list = new(); | ||
var head = this; | ||
while (head != null) | ||
{ | ||
list.Add(head.val.ToString()); | ||
head = head.next; | ||
} | ||
return string.Join("->", list); | ||
} | ||
} | ||
} |
Oops, something went wrong.