 { //删除第6个位置到第10个位置上的值 arr[i] = arr[i + 1]; } arr[9] = 0; //最后一个位置赋0
查找:遍历整个数组,找到目标元素所在的位置即可。 int index = -1; //存放目标元素在数组中的位置 int target = 5; //要查找的目标元素 for (int i = 0; i < 10; i++) { if (arr[i] == target) { index = i; break; } }
链表: 1. 插入:新建一个节点,插入到指定位置即可。 struct ListNode { int val; ListNode next; }; ListNode node = new ListNode(); //新建一个节点 node->val = 6; //设置节点的值 node->next = head->next->next; //插入到第3个位置 head->next->next = node;
删除:找到要删除的节点,把它的前一个节点的指针指向它的后一个节点即可。 ListNode cur = head->next; ListNode pre = head; while (cur != nullptr) { if (cur->val == target) { pre->next = cur->next; delete cur; break; } pre = cur; cur = cur->next; }
查找:同样需要遍历整个链表,找到目标节点即可。 ListNode* cur = head->next; int index = -1; while (cur != nullptr) { index++; if (cur->val == target) { break; } cur = cur->next; }
堆: 1. 插入:把新元素插入到堆底,然后执行堆化操作(上浮/下沉)即可。 vector heap; //使用vector作为堆的容器,方便动态扩容 heap.push_back(6); //插入新元素 int cur = heap.size() - 1; //标记新元素在堆中的位置 while (cur > 0) { //上浮操作 int parent = (cur - 1) / 2; if (heap[parent] < heap[cur]) { swap(heap[parent], heap[cur]); cur = parent; } else { break; } }
删除:把要删除的元素移到堆底,然后执行堆化操作(上浮/下沉)即可。 int index = 5; //要删除的元素在堆中的位置 swap(heap[index], heap.back()); //把要删除的元素移到堆底 heap.pop_back(); //弹出堆底元素 int cur = index; //标记要删除的元素在堆中的位置 while (cur < heap.size()) { //下沉操作 int left = cur * 2 + 1; //左儿子位置 int right = cur * 2 + 2; //右儿子位置 int maxIndex = cur; //记录当前节点、左儿子和右儿子中的最大值 if (left < heap.size() && heap[left] > heap[maxIndex]) { maxIndex = left; } if (right < heap.size() && heap[right] > heap[maxIndex]) { maxIndex = right; } if (maxIndex != cur) { swap(heap[cur], heap[maxIndex]); cur = maxIndex; } else { break; } }
查找:直接遍历堆容器即可,由于是二叉树结构,查找复杂度为O(n)。 int index = -1; for (int i = 0; i < heap.size(); i++) { if (heap[i] == target) { index = i; break; } }
总体来说,在使用数据结构(如数组、链表、堆等)时,需要结合具体的操作来实现,在实现过程中需要对数据结构的特点进行深入理解和灵活应用,才能达到高效、可靠的效果。
试试dev