日常开发中,可能会用到的数据结构类型
数组
一组相同类型的元素的集合,可以通过下标进行访问和操作。在C#中,有 Array、ArrayList、List
时间复杂度:查找是 O(N)。插入和删除是O(N)。数组通过下标直接访问 元素,时间复杂度是O(1)。数据的每次新增或者删除,数据需要重新排列顺序,时间复杂度是O(N)
链表
由节点组成的数据结构,每个节点包含元素和指向下一个节点的指针。 在C# 中,有 LinkedList、LinkedListNode
1.元素不连续分配,每个元素都有记录前后节点,节点值可以重复
2.不能下标访问,找元素就只能遍历 查找不方便
LinkedListNode<int> node123 = linkedList.Find(123); // 元素123的位置 从头查找
时间复杂度: 查找是 O(N)。插入和删除是O(1)
哈希表
基于Key-Value的存储结构,查找快。在c#中有 HashTable,HashSet(可自动去重), Dictionary
也叫散列表,不保证元素的顺序,在散列表中,使用哈希算法计算得出元素存放位置,使用数据来实现。如果需要哈希碰撞,可能使用链表或者其他方式解决问题。所以哈希表,它结合了数组和链表两种方式。
时间复杂度: 查找是 O(1)。插入和删除是O(1)
队列
先进先出。在C# 中 有 Queue。
先进先出 放任务延迟执行,A不断写入日志任务 B不断获取任务去执行(Queue<string> numbers = new Queue<string>())
栈
先进后出。在C#中 有 Stack
回文题
public class ListNode
{
public int val;
public ListNode next;
public ListNode(int val = 0, ListNode next = null)
{
this.val = val;
this.next = next;
}
}
public static void MainIsPalindrome()
{
ListNode n1 = new ListNode(1);
ListNode n2 = new ListNode(2);
ListNode n3 = new ListNode(2);
ListNode n4 = new ListNode(1);
n1.next = n2;
n2.next = n3;
n3.next = n4;
bool result = IsPalindrome2(n1);
Console.WriteLine(result); // 输出 true
}
public static bool IsPalindrome2(ListNode node)
{
Stack<int> stack = new Stack<int>(); // 栈
Queue<int> queue = new Queue<int>(); // 队列
while (node != null)
{
stack.Push(node.val);
queue.Enqueue(node.val);
node = node.next;
}
while (stack.Count > 0)
{
var a = stack.Pop();
var b = queue.Dequeue();
if (a != b)
{
return false;
}
}
return true;
}
解答此题,通过充分利用栈和队列,巧妙进行查找,解决问题。
标签:node,常用,ListNode,val,next,new,数据结构,public From: https://www.cnblogs.com/Qintai/p/18177808