Loading

常用的数据结构

日常开发中,可能会用到的数据结构类型

数组

一组相同类型的元素的集合,可以通过下标进行访问和操作。在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;
}

解答此题,通过充分利用栈和队列,巧妙进行查找,解决问题。

posted @ 2024-05-07 17:03  大意了啊  阅读(1)  评论(0编辑  收藏  举报